2016-08-24 45 views
6

kullanarak herhangi istisna yok.Java UncaughtExceptionHandler Ben bir dizi görevi çalıştırmak bir Java kütüphane var JNI'yı

Thread.setDefaultUncaughtExceptionHandler(new JavaUncaughtExceptionHandler());

UncaughtExceptionHandler UncaughtExceptionHandler uygular ve sadece STDERR hata günlük bilgileri: Ve kullanılarak varsayılan yakalanmamış istisna işleyicisi kayıtlı.

Java kütüphanem C++ kodundan JNI aracılığıyla çağrılır ve JNI bunu ExceptionCheck() ile çağırır ve hatayı C++ olarak FATAL olarak günlüğe kaydeder.

sorundur: Çalışma zamanında

, bir RuntimeException (veya başka yakalanmamış istisna), hata C++ yakalanan var benim Java kodunda olur varken yerine iplik varsayılan yakalanmamış istisna işleyici olarak tescil benim JavaUncaughtExceptionHandler arasında .

  1. hariç davranış mı?
  2. zaman DefaultUncaughtExceptionHandler aslında çağırıldım olacak? İş parçacığı kapanmadan önce biliyorum, ama özellikle JNI durumunda. C++ veya daha sonra C++ kodu bittikten sonra da denir). Ben JNI içinde iplik yönetimine, hem de ilgili herhangi bir bilgi paylaşımında lütfen ilgili olduğunu düşünüyorum.
  3. ben çok benim Java kodunda tüm özel durumları (a try/catch blok koymak dışında başka alternatif bir yol)

Teşekkür yakalayabilirsiniz yine de var mı.

cevap

1
Eğer Java çağırma API bahsediyoruz gibi geliyor

(yani, bir C++ programı içinden Java yöntemleri aradığınız aramalar başka bir yol gitmek basit JNI aksine,.)

ben Büyük bir uzman değilim, ancak Java Invocation API ile çalıştım. Bildiğim kadarıyla, bir Java iş parçacığının run() yöntemiyle bir istisna yapıldığında yakalanmamış bir istisna işleyicisi yalnızca çağrılır. Üste | Geri Bildirim Ver Daha fazla bilgi Daha fazla bilgi edinin Ancak, , C/C++ kodu tarafından oluşturulmuş bir iş parçacığı için hiçbir run() yöntemidir.

ederim o kadar C deniyor zaman Java içine benim aramaları tüm her zaman döndürür

jobject return_value = (*env)->CallObjectMethod(env, instance, method_id, ...); 

benziyordu, ama return_value kullanmadan önce, sen yönteme olmadığını kontrol etmek zorunda C, değil C++, yazdığı normal olarak döndü veya bir istisna attı.

Bir istisna attıysa, istisnanın "yakalanmamış" olmasının bir yolu yok, C kodu (*env)->ExceptionClear(env)'u çağırmıyorsa (örneğin, C kodu istisnayı "yakalamazsa) Ne olduğunu hatırlamıyorum, ama bence iyi değil.

+0

James, sizin açıklama için çok oldukça yararlı teşekkürler. Biz jenv.CheckException (...) yöntemi kullanılarak Java yöntemi çağırmak yoktur ve istisna C++ yakalanır. Bu yüzden kodun çalışmasının güvenli olduğunu düşünüyorum, ancak sadece C yerine Java'daki tüm istisnaları günlüğe kaydetmek istiyoruz. Ancak, UncaughtExceptionHandler tarafından gerçekleştirilemez. – user788767