Garip durum tablosu girdisi Sun'un ürettiği javac
Verilen bu program:
class Test {
public static void main(String[] args) {
try {
throw new NullPointerException();
} catch (NullPointerException npe) {
System.out.println("In catch");
} finally {
System.out.println("In finally");
}
}
}
Güneş aşağıdaki bayt kodu üretir javac
(v 1.6.0_24):
public static void main(java.lang.String[]);
// Instantiate / throw NPE
0: new #2; // class NullPointerException
3: dup
4: invokespecial #3; // Method NullPointerException."<init>":()V
7: athrow
// Start of catch clause
8: astore_1
9: getstatic #4; // Field System.out
12: ldc #5; // "In catch"
14: invokevirtual #6; // Method PrintStream.println
17: getstatic #4; // Field System.out
// Inlined finally block
20: ldc #7; // String In finally
22: invokevirtual #6; // Method PrintStream.println
25: goto 39
// Finally block
// store "incomming" exception(?)
28: astore_2
29: getstatic #4; // Field System.out
32: ldc #7; // "In finally"
34: invokevirtual #6; // Method PrintStream.println
// rethrow "incomming" exception
37: aload_2
38: athrow
39: return
Aşağıdaki özel durum tablo:
Exception table:
from to target type
0 8 8 Class NullPointerException
0 17 28 any
28 29 28 any
Neden özel durum tablosunda son giriş içerir mi?!
eğer astore_2
bir istisna, onu yakalamak, ve aynı talimat tekrar deneyin".
Bu giriş bile boş deneyin / / son maddeleri gibi yakalamak olarak üretilmektedir
try {} catch (NullPointerException npe) {} finally {}
Bazı gözlemler
- Eclipse derleyici bu tür herhangi bir özel durum tablosu girdisi üretmez
- JVM spec the
astore
instruction için herhangi bir çalışma zamanı özel durumlar belge değil. - JVM herhangi bir talimat için
VirtualMachineError
atmak için yasal olduğunu biliyorum. Tuhaf bir giriş bu talimat dışarı yayılmasını engeller eğer böyle bir hata sanırım.
CEVAP
Sadece iki olası açıklama var: derleyici içeren bir hata ya da belirsiz nedenlerle filigran bir tür yerleştirme.
Bu giriş herhangi bir özel durum dış özel durum için yürütme akışı işleyicisi veya finally blok gönder kendisi sonunda bir blok, ama asla "tekrar" nihayet bloğu aynı. çalışma atılmış çünkü kesinlikle sahte.
Ayrıca, iyi bir kanıt bu işte bir hata/filigran, aslında bu Tutulma (ve belki de diğer Java derleyicileri) üreten böyle girdi, ve hatta bu yüzden Eclipse üretilen sınıfları iş ince Sun'ın JVM.
O, bu yazı sınıf dosyası geçerli ve doğrulanmış gibi görünüyor çünkü ilginç olduğunu söyledi. Eğer JVM bir uygulayıcı olsaydım, o giriş yok sayıp Sun/Oracle bir hata doldurabilirim!
UİActionSheet iptal düğmesi garip davr...
Java JVM profilleme, iş parçacığı duru...
Android görüşlerini herhangi bir grafi...
Nasıl üst durum çubuğunda yükleme göst...
0 HTTP Durum kodu bir anlamı var mı?...