Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Il throws di una Exception può generare un Error?

    Salve.
    Credevo mi fosse chiaro che Exception ed Error sono le due sottoclassi di Throwable, e invece a quanto pare c'è qualcosa che non mi quadra immediatamente.

    Javac mi compila questo codice...
    codice:
    public class Pag423 {
    	public static void methodX() throws Exception {
    		throw new AssertionError();
    	}
    	public static void main(String[] args) {
    		try{
    			methodX();
    		}
    		catch(Exception e) {
    			System.out.println("EXCEPTION");
    		}
    	}
    }
    secondo cui methodX() è abilitato a generare una Exception... Poi però, invocato nel try, genera tranquillamente un Error semplicemente perché quello ci trova scritto!
    Mi aspettavo un errore di compilazione, non la corretta esecuzione del methodX() invocato nel try{}...

    La console riporta questo strano messaggio...
    Exception in thread "main" java.lang.AssertionError
    at Pag423.methodX(Pag423.java:3)
    at Pag423.main(Pag423.java:7)
    Con che logica Java risale da Exception a Throwable e poi scende in Error a prendere quell'errore?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Credevo mi fosse chiaro che Exception ed Error sono le due sottoclassi di Throwable
    Infatti sono le uniche sottoclassi dirette di Throwable.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Javac mi compila questo codice...

    Con che logica Java risale da Exception a Throwable e poi scende in Error a prendere quell'errore?
    Gli Error sono tecnicamente "unchecked", quindi NON c'è alcun obbligo di dichiararli né di catturarli/gestirli. Gli Error comunque sono concettualmente un po' diversi dalle altre eccezioni, nel senso che rappresentano errori "gravi" a cui tipicamente e difficilmente si può porre rimedio.

    Comunque AssertionError non ha nulla a che fare con Exception. AssertionError NON deriva da Exception .... deriva da Error che deriva da Throwable. Quindi NON è il tuo catch di Exception nel main che può catturare AssertionError.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Gli Error sono tecnicamente "unchecked", quindi NON c'è alcun obbligo di dichiararli né di catturarli/gestirli. Gli Error comunque sono concettualmente un po' diversi dalle altre eccezioni, nel senso che rappresentano errori "gravi" a cui tipicamente e difficilmente si può porre rimedio.

    Comunque AssertionError non ha nulla a che fare con Exception. AssertionError NON deriva da Exception .... deriva da Error che deriva da Throwable. Quindi NON è il tuo catch di Exception nel main che può catturare AssertionError.
    Questo è quanto risulta anche a me, per questo mi sembra tutto assurdo nel leggere certi codici e come vengono eseguiti.
    Non ho chiamato in ballo il catch perché lui si aspetta una Exception e non un Error, bensì l'esecuzione del blocco try che spassionatamente genera un errore che non è tra le sottoclassi di Exception.
    Secondo me doveva starci
    codice:
    public static void methodX() throws Error
    proprio perché se volessi prepararmi a lanciare un IOEXception, potrei scrivere
    codice:
    public static void methodX() throws Exception
    non
    codice:
    public static void methodX() throws Error
    Invoco cioè la classe precisa o una sua superclasse, non una superclasse "zia" di quella che poi vado a generare.

    Insomma l'Error in questo caso si presenta senza invito (sennò il throws che viene specificato a fare...). Com'è possibile?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    per questo mi sembra tutto assurdo nel leggere certi codici e come vengono eseguiti.
    Non c'è nulla di strano o assurdo ... basta conoscere le regole.


    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Non ho chiamato in ballo il catch perché lui si aspetta una Exception e non un Error, bensì l'esecuzione del blocco try che spassionatamente genera un errore che non è tra le sottoclassi di Exception.
    Un metodo può dichiarare una eccezione checked ma non lanciarla. Semplicemente perché lui non la lancia ma ... un override in una sottoclasse potrebbe invece.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Secondo me doveva starci
    codice:
    public static void methodX() throws Error
    Gli Error, lo ripeto, sono "unchecked". Non c'è alcun obbligo di dichiararli con il throws né di catturarli/gestirli in qualche modo. Quindi mettere throws Error per il compilatore non implica nulla. Al massimo è utile a livello documentativo, cioè nel javadoc che si può generare, verrebbe fuori ben evidente che il metodo dichiara Error. Insomma, serve più all'umano che al compilatore un throws del genere.
    Gli Error comunque, tipicamente, non si dichiarano (mai fatto personalmente).

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Insomma l'Error in questo caso si presenta senza invito (sennò il throws che viene specificato a fare...). Com'è possibile?
    Sono le eccezioni "checked" che vanno dichiarate. Queste vanno considerate dal compilatore e dal programmatore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Lo so che gli Error sono unchecked, allora quel throws Exception serve solo a confondere!
    Togliendo throws Exception, noto che l'esecuzione è identica: Exception in thread "main" java.lang.AssertionError che sembra contraddittorio poiché AssertionError non appartiene alle Exception ma agli Error.

    Cioè per Java il throw di un errore qualsiasi è sempre una Exception perché sto controllando io l'evento throw new AssertionError()?
    Java cioè vede prima che il codice chiama qualcosa con un throw e per lui è una Exception, anche se dopo gli metto una classe creata da me che estende un qualunque Throwable?

    Per fare andare in porto l'esecuzione, devo scrivere:
    codice:
    public class Pag423 {	public static void methodX() { // tolto il throws Exception poiché inutile
    		throw new AssertionError();
    	}
    	public static void main(String[] args) {
    		try{
    			methodX();
    		}
    		catch(AssertionError ae) { // ora può gestire ciò che il throw ha generato
    			System.out.println("EXCEPTION");
    		}
    	}
    }
    Stavolta viene eseguito il catch perché ho da gestire l'errore che ho creato, sebbene la sua non gestione (quando il catch si aspetta una Exception) interrompe l'esecuzione avvisandomi in console di una Exception.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Lo so che gli Error sono unchecked, allora quel throws Exception serve solo a confondere!
    Se quello è un "quiz" o qualcosa del genere .... allora sì certo, è fatto per confondere!

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Togliendo throws Exception, noto che l'esecuzione è identica: Exception in thread "main" java.lang.AssertionError che sembra contraddittorio poiché AssertionError non appartiene alle Exception ma agli Error.
    Non capisco perché dovrebbe essere contraddittorio. Una eccezione tecnicamente "unchecked" può essere lanciata in qualunque punto senza dover anticipare/dichiarare alcunché, indipendentemente dalle eccezioni "checked" eventualmente dichiarate con throws.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Cioè per Java il throw di un errore qualsiasi è sempre una Exception perché sto controllando io l'evento throw new AssertionError()?
    throw lancia solo una eccezione. Può essere catturata già nel metodo (dove viene lanciata) oppure può uscire fuori dal metodo. Se è checked, per poter uscire fuori dal metodo DEVE essere dichiarata (esattamente quella eccezione oppure un supertipo).
    Tutto qui.

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Java cioè vede prima che il codice chiama qualcosa con un throw e per lui è una Exception, anche se dopo gli metto una classe creata da me che estende un qualunque Throwable?
    Forse devi ancora chiarirti le idee ....

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Per fare andare in porto l'esecuzione, devo scrivere:
    [....]
    Stavolta viene eseguito il catch perché ho da gestire l'errore che ho creato, sebbene la sua non gestione (quando il catch si aspetta una Exception) interrompe l'esecuzione avvisandomi in console di una Exception.
    Qui ovviamente ok, viene lanciato un AssertionError e più a monte c'è un catch proprio di AssertionError. Quindi è effettivamente catturata.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.