2012-08-01 20 views
10

Normalde, Java derleyici, atılan tüm denetlenen istisnaların atlatma belirtiminde olduğunu doğrular. Yerel bir işlev, işlev belirtiminde olmayan java işaretli bir istisna atarken özel bir şey olursa veya çalışma zamanında atlatma belirtimi listesi göz ardı ediliyor mu?Java kontrol edilmiş istisna fonksiyonun özellik belirtiminde değil mi?

C++

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

C++ işlev adı muhtemelen karıştırılmış olur (

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

Java

. Ayrıca loadlibrary deneyin catch olmalıdır. Umurumda değil, ben inanmıyorum Bu sorunla ilgili olabilir. Kodda başka hatalar da olabilir, ancak bunlar büyük olasılıkla da alakalı değildir.)

+0

Bu bir yinelenen olmadığına şaşırdım. –

cevap

5

İşaretlenmiş istisnalar mekanını kandırmak için yerel koda başvurmanız gerekmez. m. Javadoc on Thread.stop(Throwable)'a bakın. Tüm gün boyunca kodumun, bildirmediği kodun ortasında bir InterruptedException nasıl attığını merak ettim. O zaman cevabı bulamadım ama şimdi biliyorum :)

Anında sorunuzu cevaplama: evet, kontrol edilen istisna mantığı sadece bir derleme özelliğidir ve çalışma zamanında göz ardı edilir.

+0

Bağladığınız işlev, iyi bir örnek değildir, çünkü görebildiğim kadarıyla, işaretleme belirtim listesinde bulunmayan, işaretlenmemiş istisnalar atar. –

+0

Aşağıdaki cümleyi okuyun, sonra: "Bu iş parçacığı tarafından temsil edilen iş parçacığı, anormal bir şekilde gerçekleştirdiği her şeyi tamamlamaya zorlanır ve Throwable nesnesini bir istisna olarak atabilir." –

+0

Oh, bu durumu kaçırdı, Exception sınıf adlarını arıyordum. İlginç bul. –