2010-05-29 21 views
7


Come il titolo suggerisce, come posso dire a un JVM gettato eccezione da un programmazione (significa questo, lanciata da un programmatore o il programma) eccezione generata?Come distinguere tra programmatore e JVM eccezioni


eccezioni JVM


1) ArrayIndexOutOfBoundsException

2) ClassCastException

3) NullPointerExc eption



programmazione gettati


1) NumberFormatException

2) AssertionError


Molte grazie

risposta

4

io non sono sicuro di cosa si intende per eccezioni JVM. Queste sono tutte eccezioni di runtime che possono essere lanciate dal programmatore in qualsiasi punto (eccezione AssertionError), sebbene sia considerato di scarsa qualità per generare alcune eccezioni come NullPointerException. Il punto è che non esiste una qualità che separi le due categorie che menzioni oltre al loro uso tipico. Tutte le eccezioni di runtime si estendono, direttamente o indirettamente, RuntimeException.

Dalle JavaDocs per Throwable:

Solo

oggetti che sono istanze di questa classe (o una delle sue sottoclassi) sono gettati dalla Java Virtual Machine o può essere generata dalla Java buttare dichiarazione.

Poiché questa stessa superclasse definisce tutte le eccezioni lanciate dalla JVM o da un programmatore, non è possibile distinguerle facilmente.

+0

Eccezioni JVM Tali eccezioni o errori che sono esclusivamente o più generati dalla JVM. Eccezioni programmatiche Tali eccezioni vengono generate esplicitamente dall'applicazione e/o dai programmatori API. – Haxed

+0

@Haxed: il problema è che il programmatore può lanciare esplicitamente QUALSIASI eccezione (eccetto AssertionError). Pertanto, non puoi fare ciò che vuoi fare. – NotMe

+0

@Chris: AssertionError è Throwable, stavo solo chiarendo che non è una RuntimeException come le altre. –

3

Non credo che troverete un elenco completo, dal momento che non esiste una chiara distinzione tra JVM e programmatore avviato eccezioni, a parte alcuni casi particolari:

  • più Error classi sono gettati dalla VM , a causa di cause interne o esterne. L'unica eccezione ThreadDeath, viene lanciata in un thread quando quel thread viene interrotto, ed è un po 'un "hack" per far sì che il thread si srotoli ed esca.
  • Le eccezioni più controllate riguardano problemi ambientali che portano a malfunzionamenti di alcune operazioni, ma possono essere risolvibili e non sono fatali per la JVM (IOException, SQLException, RemoteException).
  • il resto, eccezioni non controllate, sono una combinazione di entrambe le eccezioni avviate da jvm e dal programmatore. Ad esempio, il JDK genera IllegalArgumentException quando i parametri del metodo non devono spec. È un'eccezione JVM o un'eccezione programmatica? Non è chiaro se la tua definizione di eccezioni JVM include o meno il JDK. ArrayIndexOutOfBounds viene generato per accessi di array illegali, generati dalla JVM, ma viene anche generato in alcuni apis, ad es. Track.get da java.midi. (Anche se questo può essere discusso come scarsa forma, e la superclasse IndexOutOfBounds avrebbe dovuto essere usato al posto.)
5

Non si può fare questo in modo statico, perché non esiste tale distinzione.

Qualsiasi eccezione definita nelle librerie di classi Java standard può essere generata dall'applicazione o dal codice di libreria di terze parti. In alcuni casi, è una brutta (o addirittura terribile) idea lanciare un'eccezione standard, ma in altri è la cosa raccomandabile da fare.

L'unico modo possibile per distinguere tra un'eccezione generata dalla JVM e dal codice dell'applicazione è esaminare i frame dello stack dall'eccezione generata per determinare quale classe ha istanziato l'eccezione. (Strettamente parlando che non ti dice dove è stata lanciata l'eccezione ... ma è abbastanza vicino dato che le eccezioni sono quasi sempre istanziate e gettate nella stessa dichiarazione.)

Ma anche questa non è una cosa particolarmente utile fare. Voglio dire, qual è la differenza semantica tra un'eccezione generata dal codice dell'applicazione e la libreria di classi? Di certo non dice nulla sulla causa principale del problema.

+0

Questo non è sempre vero. Mentre si dice che cosa getta jvm è difficile, è abbastanza facile dire quale sia chiaramente un errore del compilatore. Vedi mdma per un buon esempio. Le eccezioni verificate esistono solo sotto eccezione e devono essere intercettate o generate o il compilatore avrà esito negativo (IOException, ReflectiveOperationException, FontFormatException, CloneNotSupportedException, RemoteException; più include le loro sottoclassi). –

+0

@AndrewScottEvans - Mi dispiace ma il tuo commento non ha molto senso per me. Sì, certo sappiamo tutti la distinzione tra le eccezioni controllate e non controllate e che le eccezioni controllate devono essere catturate o dichiarate come "lanciate". Ma spuntato vs non selezionato non è la distinzione che la domanda sta cercando di fare. –

+0

Questo è in realtà ciò che stai chiedendo. Il modo migliore per dire cosa deve essere lanciato dal programmatore è con le eccezioni di tempo di compilazione verificate. Devono essere sempre lanciati in modo programmatico, esplicito. Le eccezioni e gli errori JVM vengono generati in fase di runtime. La maggior parte esiste sotto runtime e TUTTI sono deselezionati. Raccomando di leggere una guida allo studio o un libro di test SE7. Aiuterà. –

Problemi correlati