2016-03-30 24 views
1

VS I hata [zamanı hatası] ve İstisna arasındaki farkı biliyorum. {JAVA referans konuşmak}. Ancak ölümcül hata ve istisna aynı şey veya onlar farklı.Ya da java ölümcül bir hata kavramı yok mu? Google'da arama yaptım, ancak oldukça kafa karıştırıcıydı.hata özel durum

+2

'Error' ve' Exception' arasındaki farkı bildiğinizden emin misiniz? Çünkü bir "RuntimeException" var, bu yüzden "Error" un bir şekilde çalışma zamanına özgü olduğunu düşünüyorsanız, yanılıyorsunuz demektir. – Kayaman

+0

Bunu hak ettim -> Hem java.lang.Error hem de java.lang.Exception sınıfları java.lang alt sınıflarıdır.İşeri sınıfı, ancak aralarında bazı önemli farklılıklar vardır. java.lang.Error sınıfı, esas olarak uygulamanın çalıştığı ortamın neden olduğu hataları temsil eder. Örneğin, OutVfMemoryError, JVM bellek bittiğinde veya yığın taşması durumunda StackOverflowError ortaya çıktığında oluşur. –

+2

"Ölümcül olmayan" hatadan farklı olarak "ölümcül" hata diye bir şey yoktur; Ayrıca, istisnalar ölümcül olabilir. Sadece, bu hata/istisnanın JVM'nin sona erdirilmesine neden olup olmadığına bağlı olarak nasıl ele alındıklarına bağlıdır. Hataların genellikle yakalanmaması gerektiğini unutmayın; bazı istisnalar olmalı. –

cevap

5

Java tutorial on Exceptions'u okuyun.

Kısa açıklama için bu küçük kılavuzu kullanabilirsiniz. Java Özel Durumu hiyerarşisi (kırmızı) ve her kategoride birkaç örnek (mavi) ile sınıf şemasına bakın.

Throwable

enter image description here

: Java istisna mekanizması kullanılarak atılan (ve yakalanan) edilebilir bir şey ortak atası.

Error: Eğer "önemli özel durum" dediğimiz yaklaşık olarak yaklaşık Error s düşünebilir. Uygulamanın herhangi bir geri kazanılmasının bile denenmesi genellikle mantıklı değildir. OutOfMemoryError veya StackOverflowError, numaralı başvuruda, nolu zor bir şekilde yapabilecekleri ölümcül hatalardır.

Error s yakalamayın, programın çökmesine ve sorunu dışarıda bırakmasına izin verin.

RuntimeException: vb olmayan saplı null işaretçi de referans, yerine getirmeyen bir yöntem sözleşmeleri çoğunlukla programcı hataları (aşağıdaki örneğe bakınız), kullanılmalıdır

bunlar teknikleri burada rağmen Tüm istisnalar RuntimeException s'ye sarılır ve iş kodunun dışına işlenir (genellikle AOP ile), normal olarak bir RuntimeException'un ortaya çıkması, programın çökmesine ve kaynak kodunu düzeltmesine izin vermeniz gerektiği anlamına gelir.

/** 
* Does something with s. 
* @param s The input string 
*/ 
public void badlyDesignedMethod(String s) { 
    // Here the programmer omitted to check s against null 
    int i = s.length(); 
    ... 
} 

/** 
* Does something with s. 
* @param s The input string; must not be null 
*/ 
public void betterDesignedMethod(String s) { 
    if (s == null) { 
     throw new IllegalArgumentException("The parameter s must not be null!); 
    } 
    int i = s.length(); 
    ... 
} 

public void caller() { 
    badlyDesignedMethod(null); // will throw NullPointerException 
    // It is the fault of the programmer of badlyDesignedMethod() 
    // as they have not specified that the parameter must not be null. 

    betterDesignedMethod(null); // will throw IllegalArgumentException 
    // Now it is the fault of the programmer of caller() 
    // as they violated the contract of betterDesignedMethod() 
    // which DOES tell them that the parameter must not be null 
} 

Error ler Hem ve RuntimeException ler bir yöntem onları atar ve arayanlar onları yakalamak gerekmez beyan etmek zorunda değildir, bunun anlamı kontrolsüz vardır, yani çağrı çevreleyen sahip olmayan try-catch bloğu ile.

Diğer (Exception miras ve RuntimeException değil) istisna: Çoğunlukla bir yöntem ile ilgili faydalı bilgiler taşıyan amaçlanan (throws...) beyan ve (try-catch) yakalanmış olması gereken özel onun arayan: veritabanı kullanılamıyor, dosya açılamıyor vb.

Bunlar, kodunuz tarafından ele alınması gereken istisnalardır. "Beklenmeyen istisnalar" olan çalışma zamanı istisnalarına kıyasla "beklenen istisnalar" dır.

public void doSomethingWithFile(String fileName) throws IOException { 
    if (/* file is not accessible */) { 
     throw new IOException("File " + fileName + " is not accessible!"); 
    } 
    ... 
} 
public void caller() { 
    try { 
     doSomethingWithFile("/home/honza/file.txt"); 
    } 
    catch (IOException e) { 
     // handle the fact that the file is not accessible 
     return; 
    } 
    ... 
} 
1

FATAL sözcüğü, genellikle bir logger çerçevesi bağlamında kullanılır, örn.g. log4j, SLF4J, günlüğe kaydetme ve daha fazlası. Şimdi bir günlük dosyasında seyir üzerinde bir işaret

2015-09-28 15:21:48,222 Thread-4 FATAL Unable to register shutdown hook because JVM is shutting down. java.lang.IllegalStateException: Cannot add new shutdown hook as this is not started. Current state: STOPPED 
at org.apache.logging.log4j.core.util.DefaultShutdownCallbackRegistry.addShutdownCallback(DefaultShutdownCallbackRegistry.java:113) 
at org.apache.logging.log4j.core.impl.Log4jContextFactory.addShutdownCallback(Log4jContextFactory.java:271) 
at org.apache.logging.log4j.core.LoggerContext.setUpShutdownHook(LoggerContext.java:240)  

Bu gibi mesajlar bulabilirsiniz bir operasyon gerçekleşmesi bir hata veya özel duruma neden ve hata veya istisna, ÖLÜMCÜL düzeyde logger çerçevesini kullanan geliştirici tarafından kaydedilir, . Mesaj herhangi bir seviyede kaydedilmiş olabilir. Örneğin

Log4J birçok günlük düzeylerini sunmaktadır: WARN KAPALI, ÖLÜMCÜL, HATA, INFO, DEBUG, TRACE,

http://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/Level.html

TÜM

Sadece daha fazla kafa karışıklığına HATA adında bir günlük düzeyi vardır neden olacak olan.

Sonuç olarak, FATAL istisnası Vs FATAL hatası: FATAL, istisna veya hata nesnesinin günlüğe kaydedildiği ve gerçekleşen istisna veya hatayla bir ilişkisi olmayan, ancak bir geliştiricinin FATAL düzeyinde oturum açtığı günlük düzeyidir. Gözünüzü yakalamak ve tepki vermektir.

Log4J'in FATAL düzeyine ne zaman oturum açılacağı belgesine göre "Uygulamanın devam etmesini engelleyecek ciddi bir hata."