2012-08-01 8 views
10

Normalmente, il compilatore Java conferma che tutte le eccezioni controllate che vengono lanciate sono nella specifica throw. Succede qualcosa di speciale quando una funzione nativa lancia un'eccezione controllata di java che non era presente nell'elenco delle funzioni, oppure l'elenco delle specifiche di lancio semplicemente ignorato in fase di runtime?Java ha controllato l'eccezione non nella specifica della funzione?

C++

void function(JNIEnv * env, jclass jc) { 
    jclass newExcCls = env->FindClass("java/lang/NullPointerException"); 
    env->ThrowNew(newExcCls, "ERROR"); 
} 

Java

public class Tester { 
    static { 
     System.loadLibrary("MyLibrary"); 
    }   
    private static native void function(); 
    public static void main(String [ ] args) { 
     try { 
      function(); 
     } catch(Exception e) { //is it caught? Or what happens? 
      e.printStackTrace(); 
     }   
    } 
} 

(Il nome della funzione C++ sarebbe probabilmente alterati. Inoltre loadLibrary dovrebbe essere in un tentativo di cattura. Non importa, non credo che sia Potrebbero esserci altri errori nel codice, ma probabilmente non sono rilevanti.)

+0

Sono un po 'sorpreso, questo non è un duplicato. –

risposta

5

Non è nemmeno necessario ricorrere al codice nativo per ingannare il meccanismo delle eccezioni verificato m. Vedi lo Javadoc on Thread.stop(Throwable). Una volta mi è stato chiesto per tutto il giorno come il mio codice lanciasse uno InterruptedException nel mezzo del codice che non lo dichiarava. Allora non ho nemmeno trovato la risposta, ma ora lo so :)

Rispondere alla domanda immediata: sì, la logica di eccezione controllata è una funzione solo per il compilatore e ignorata in fase di esecuzione.

+0

La funzione che hai collegato non è un grande esempio, poiché genera solo eccezioni non verificate per quanto posso vedere, che non devono necessariamente rientrare nell'elenco delle specifiche di lancio. –

+0

Leggere la seguente frase, quindi: "Il thread rappresentato da questo thread è costretto a completare qualsiasi cosa stia facendo in modo anomalo e a lanciare l'oggetto Throwable obj come eccezione." –

+0

Oh, mancava quella frase, stavo cercando i nomi delle classi Exception. Scoperta interessante –

Problemi correlati