11 Stimmen

Eine von Java geprüfte Ausnahme, die nicht in der Wurfspezifikation der Funktion enthalten ist?

Normalerweise bestätigt der Java-Compiler, dass alle geprüften Ausnahmen, die geworfen werden, in der throw-Spezifikation enthalten sind. Passiert etwas Besonderes, wenn eine native Funktion eine geprüfte Java-Ausnahme auslöst, die nicht in der throw-Spezifikationsliste der Funktion enthalten ist, oder wird die throw-Spezifikationsliste zur Laufzeit einfach ignoriert?

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

(Der C++-Funktionsname würde wahrscheinlich verstümmelt werden. Auch loadLibrary sollte in einem try catch stehen. Ist mir egal, ich glaube nicht, dass es für das Problem relevant ist. Es gibt möglicherweise andere Fehler im Code, aber die sind wahrscheinlich auch nicht relevant).

5voto

Marko Topolnik Punkte 188258

Sie müssen nicht einmal auf nativen Code zurückgreifen, um den Mechanismus der geprüften Ausnahmen zu überlisten. Siehe die Javadoc über Thread.stop(Throwable) . Ich habe mich einmal einen ganzen Tag lang gefragt, warum mein Code eine InterruptedException inmitten von Code, der es nicht deklariert hat. Damals habe ich die Antwort nicht einmal gefunden, aber jetzt weiß ich es :)

Um Ihre unmittelbare Frage zu beantworten: Ja, die geprüfte Ausnahmelogik ist ein reines Compiler-Feature und wird zur Laufzeit ignoriert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X