Qual è il ruolo di "genera eccezioni" nella definizione del metodo in Java?

1

Alcuni metodi sono decifrati in questo modo: public int myMethod() throws Exception { (restituisce un int o lancia Eccezione se il metodo fallisce). Tuttavia, i metodi di stub in NetBeans sono simili a

public class JavaApp {
    public static void main(String[] args) {        
        if(false){ //this branch is never used
                int a = getInt();
        }
    }

    private static int getInt() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

Questo stub non tenta di restituire int . Invece è throws exception subito. Tuttavia, IDE lo accetta come sintassi valida. Il programma viene compilato e eseguito.

throw new UnsupportedOperationException è considerato un ritorno valido per qualsiasi tipo di reso? Qual è il ruolo di throws Exception nella definizione di un metodo Java?

    
posta sixtytrees 20.06.2016 - 16:31
fonte

2 risposte

4

What is the role of “throws exeption”

È usato per checked exceptions .

L'idea è che se scrivi il codice per chiamare una funzione throws FoobarException , il compilatore ti costringerà a gestire l'eccezione o ad aggiungere la stessa dichiarazione throws FoobarException alla funzione che stai scrivendo.

È un modo per assicurarti che nessuno dimenticherà che potrebbe essere lanciato un FoobarException .

This stub doesn't attempt to return an int. Instead it throws exception right away. Yet, IDE accepts it as a valid syntax. The program compiles and runs.

Le eccezioni controllate non risultano così popolari come speravano i progettisti linguistici. Infatti, hanno anticipato che quando hanno creato un'intera categoria di eccezioni non selezionate .

UnsupportedOperationException è un'eccezione non controllata. Le eccezioni non controllate funzionano esattamente come le eccezioni controllate. L'unica differenza è che non è necessario dichiarare l'eccezione quando si scrive un metodo che potrebbe lanciarlo. Ogni eccezione che eredita da java.lang.RuntimeException è deselezionata.

L'idea è che dovresti usare eccezioni controllate per le condizioni che il tuo programma dovrebbe gestire in modo aggraziato (ad esempio, informare l'utente di un file non trovato invece che solo in crash), e usare solo deselezionate per le eccezioni che "non può mai accadere" a meno che il tuo programma non sia rotto.

Is throw new UnsupportedOperationException considered a valid return for any return type?

No, non è un "ritorno", è un'eccezione. Il compilatore non si preoccupa che il tuo metodo non restituisca mai un int , perché il compilatore può dire che il tuo metodo non ritorna mai.

    
risposta data 20.06.2016 - 18:05
fonte
2

Non dice molto nei Javadoc su come questo è implementato nel compilatore, né lo fa per l'equivalente NotImplementedException in C #.

Tuttavia, non mi sorprenderebbe se l'analisi del codice statico del compilatore fosse qualcosa del genere: un'eccezione viene lanciata incondizionatamente prima che venga chiamato return , quindi non c'è bisogno di controllare il tipo di ritorno.

Quando ci pensi, questo ha senso. L'unica ragione per cui esistono queste eccezioni è di consentire all'utente di eliminare un metodo per l'implementazione successiva; sarebbe abbastanza scomodo se non potessi specificare un tipo di reso.

Sarebbe abbastanza facile scoprire se il compilatore tratta questa particolare eccezione come un caso speciale. Basta cambiarlo con qualche altra eccezione, e vedere se il compilatore si lamenta.

    
risposta data 20.06.2016 - 16:53
fonte

Leggi altre domande sui tag