Il blocco checked di C# a cosa corrisponde in Java

di il
2 risposte

Il blocco checked di C# a cosa corrisponde in Java

Buongiorno a tutti,
in C# attraverso checked, si può ottenere un OverflowException da un’operazione matematica, qual è il suo corrispettivo Java?

Per farmi capire meglio faccio un esempio C#:

sbyte c = 127; 
try {
    checked { 
        c += 10;
        Console.WriteLine("valore: " + c);
    } 
}
catch (Exception ex) {// o anche OverflowException
    Console.WriteLine(ex.Message);
}
Senza il blocco checked mostrerà “valore: -119”.
All’incirca il corrispondente Java è:

byte c = 127;
try {
    c += 10;
    System.out.println("valore: " + c);
} catch (Exception ex) {
    System.err.println(ex.getMessage());
}
Io cerco qualcosa per far eseguire il catch, sempre se esiste.
Grazie

2 Risposte

  • Re: Il blocco checked di C# a cosa corrisponde in Java

    raph1328 ha scritto:


    in C# attraverso checked, si può ottenere un OverflowException da un’operazione matematica, qual è il suo corrispettivo Java?
    Mi spiace, non c'è un corrispettivo, nel senso che in Java gli operatori matematici non lanciano eccezioni in caso di overflow/underflow.
    C'è il caso particolare in cui se una divisione è "intera" e sta dividendo per 0, allora viene lanciato ArithmeticException. Ma è l'unico caso mi pare per gli operatori matematici.

    Da Java 8 la classe Math ha un po' di metodi in più tipo addExact, decrementExact, multiplyExact, ecc... che possono lanciare ArithmeticException se c'è overflow. Ma ripeto, solo da Java 8.

    L'eventualità di overflow comunque è testabile a priori, ci possono essere librerie esterne che hanno metodi di utilità per testarlo o comunque per fare l'operazione un po' come quei metodi da Java 8.
    Ad esempio c'è la libreria Google Guava con la sua classe IntMath che ha metodi checkedAdd, ecc...
  • Re: Il blocco checked di C# a cosa corrisponde in Java

    Grazie andbin per la preziosa risposta.
    Altrimenti una valida alternativa sarebbe controllare a priori il valore e lanciare l'eccezione. Ad es:
    
    byte c = 127;
    try {
        if(b>=117){         
            throw new Exception("OverflowException");
        }
        c += 10;
        System.out.println("valore: " + b);
    } catch (Exception ex) {
        System.err.println(ex.getMessage());
    }
    
Devi accedere o registrarti per scrivere nel forum
2 risposte