2012-08-01 9 views
10

Normalerweise bestätigt der Java-Compiler, dass alle überprüften Ausnahmen, die ausgelöst werden, in der throw-Spezifikation enthalten sind. Gibt es etwas Spezielles, wenn eine native Funktion eine Java-checked-Exception auslöst, die nicht in der Funktionen-Spezifikationsliste enthalten ist, oder wird die throw-Spezifikationsliste zur Laufzeit einfach ignoriert?Java checked exception nicht in der throw-Spezifikation der Funktion?

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(); 
     }   
    } 
} 

(Die C++ Funktionsnamen wahrscheinlich verstümmelt werden würde. Auch loadlibrary sollte in einem Try-Catch sein. Sie kümmern sich nicht, ich glaube nicht, dass es Es gibt möglicherweise andere Fehler im Code, aber sie sind wahrscheinlich auch nicht relevant.)

+0

Ich bin irgendwie überrascht, das ist kein Duplikat. –

Antwort

5

Sie müssen nicht sogar auf nativen Code zurückgreifen, um die geprüfte Ausnahme mechanis zu täuschen m. Siehe die Javadoc on Thread.stop(Throwable). Ich habe mich einmal den ganzen Tag lang gefragt, wie mein Code einen InterruptedException in der Mitte des Codes warf, der ihn nicht deklariert hat. Ich habe nicht einmal die Antwort gefunden, aber jetzt weiß ich :)

Beantworten Sie Ihre unmittelbare Frage: Ja, die geprüfte Ausnahmelogik ist ein Compiler-only-Feature und zur Laufzeit ignoriert.

+0

Die Funktion, die Sie verlinkt haben, ist kein großartiges Beispiel, da sie nur so weit wie ich sehe unkontrollierte Ausnahmen erzeugt, die nicht in der Wurfspezifikationsliste sein müssen. –

+0

Lesen Sie den folgenden Satz, dann: "Der Thread, der von diesem Thread dargestellt wird, wird gezwungen, was auch immer es abnormal zu beenden und das Throwable Object Obj als Ausnahme zu werfen." –

+0

Oh, verpasste diese Sentance, ich suchte nach Exception Klassennamen. Interessanter Fund –