JVM ana yöntemle atılan bir istisnayı nasıl işler?


10

İstisnaları anlıyorum, fırlatıp atıyor, işliyor ve çağrı yığınında (örn. throws) Daha düşük bir yönteme yayıyorum .

Anlamadığım şey şudur:

public static void main(String[] args) throws Exception {
    ...
}

Şimdi, bir atma durumunda JVM'nin bunu ele aldığını varsayıyorum (doğru?). Durum buysa, sorum şu:mainException

JVM, atılan istisnaları nasıl ele alıyor main? Bu ne işe yarıyor?

Yanıtlar:


19

public static void mainJava'daki yöntemin veya mainC'deki işlevin programınızın gerçek giriş noktası olduğunu düşünebilirsiniz - ama değil. Tüm üst düzey diller (C dahil), programı başlatan ve ardından kontrol akışını giriş noktasına aktaran bir dil çalışma zamanına sahiptir. Java durumunda başlatma şunları içerecektir:

  • JVM'yi kurma
  • gerekli sınıfları yükleme
  • statik başlatıcı blokları çalışıyor. Bu main, çağrılmadan önce kullanıcı tanımlı kodu yürütebilir . Bu blokların istisnalar atması gerekmez.

İstisna işlemeyi uygulamanın çeşitli yolları vardır, ancak bu sorunun amacı için hepsi kara bir kutu olarak görülebilir. Ancak önemli olan, dil çalışma zamanının her zaman kullanıcı kodu tarafından yakalanmayan tüm istisnaları yakalayan en dıştaki istisna işleyicisini sağlaması gerektiğidir. Bu özel durum işleyici genellikle bir yığın izlemesi yazdırır, programı düzenli bir şekilde kapatır ve bir hata koduyla çıkar. Programı düzgün bir şekilde kapatmak, nesne grafiğini yok etmek, sonlandırıcıları çağırmak ve bellek, dosya tanıtıcıları veya ağ bağlantıları gibi kaynakları boşaltmaktır.

Örnekleme amacıyla, çalışma zamanının tüm kodu,

try {
    loadClasses();
    runInitializers();
    main(argv);
    System.exit(0);
} catch (Throwable e) {
    e.printStackTrace();
    System.exit(-1);
}

ancak bir dilin böyle bir kodu çalıştırması gerekmez. Aynı semantik, throwuygulanabilir ilk istisna işleyiciyi arayan (veya eşdeğeri) kodunda uygulanabilir.


9

Tüm Java kodu bir iş parçacığı bağlamında çalışır . Bağlantılı JavaDoc hata işleme ve çıkış ölçütlerini açıklar, ancak işte bunun özü:

  • JVM kendini geliştirir ve yürütme ortamını hazırlar.
  • JVM main(), uygulanabilir olan komut satırı parametrelerini kullanarak yöntemi çalıştıracak bir iş parçacığı oluşturur .
  • JVM, özel durumu standart hataya yazdıran ve sonlandıran varsayılan yakalanmamış bir özel durum işleyici ayarlar.
  • JVM iş parçacığını yürütür.

Yakalanmayan bir istisna durumunda, program yukarıdaki üçüncü kalem için etkili bir şekilde ölür. Bu davranış Java Dil Belirtimi, Bölüm 11.3'te ayrıca belirtilmiştir


ilave bilgi

Diğerleri statik bloklardan ve daha önce nasıl çalıştıklarından bahsetti main(). Ancak, bu doğru anlamak için biraz daha açıklama gerektirir.

Bir sınıf yüklerken, sınıf yükleyicisi tüm başlatması gerektiği static finaldurum ve tüm çalışma staticblok önce sınıf kenara sınıf (başlatmasını örneklerini kapsayacak şekilde kullanılabilir: bir sınıf sabitidir statik blok başlatıldı bir Java sınıfı oluşturmak sonra bir oluşturma sınıf örneği ve yapıcı sabit. Boom!) başvurur. Ancak, tüm kodlar sınıfa başvuru yapmadan önce sınıf yükleyici mantığında gerçekleşir . Ayrıca, sınıf, sınıfa başvurulan her iş parçacığına yüklenir.

Bunun anlamı, main()başka bir sınıfa (örn. Sınıf sabiti) sahip sınıfın statik bloklarını içermek için yürütmeden önce bu sınıfın yüklenmesi gerektiğidirmain() . Aksi takdirde, statik bloklar yukarıdaki gibi yürütülür. Sınıf yüklenemezse, içeren sınıf main()da yüklenemez ve program sonlanır.

Başka Bilginize: Statik bloklar olabilir atmak. Errorsolduğu gibi atılır. Exceptionsyasaklanmıştır (derleme zamanı hatası). ExceptionInInitializerErrorRuntimeExceptions içine sarılır . Bunlar, sınıf referansını (ve yüklemeyi) bir - içine dikkatlice sarmadıkça, genellikle iş parçacığını veya uygulamayı (ana iş parçacığı) öldürecek olan yakalanmamış özel durum işleyicisi başına işlenir .trycatch

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.