SORU
17 HAZİRAN 2011, Cuma


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
19 HAZİRAN 2011, Pazar


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!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS North America

    ASUS North A

    12 AĞUSTOS 2008
  • Warner Bros. UK

    Warner Bros.

    6 HAZİRAN 2008
  • WoodysGamertag

    WoodysGamert

    17 Aralık 2009