2016-03-30 2 views
1

Я знаю разницу между Ошибка ошибки во время выполнения [] и Исключение. {Говоря со ссылкой на JAVA}. Но являются фатальной ошибкой и исключением то же самое или они разные. Или нет никакой концепции фатальной ошибки в java? Я искал google, но это было довольно запутанно.неустранимая ошибка В.С. Исключение

+2

Вы точно знаете разницу между 'Error' и' Exception'? Поскольку существует «RuntimeException», поэтому, если вы считаете, что «Ошибка» как-то специфична для времени выполнения, вы ошибаетесь. – Kayaman

+0

Я реферировал это-> Оба класса java.lang.Error и java.lang.Exception являются подклассами класса java.lang.Throwable, но между ними существуют существенные различия. Класс java.lang.Error представляет ошибки, вызванные главным образом средой, в которой работает приложение. Например, OutOfMemoryError возникает, когда у JVM заканчивается память или StackOverflowError возникает, когда переполнение стека. –

+2

Нет такой вещи, как «фатальная» ошибка, в отличие от «нефатальной» ошибки; Кроме того, исключения могут быть фатальными. Это зависит только от того, как они обрабатываются (или нет) в отношении того, вызывает ли эта ошибка/исключение прекращение JVM. Обратите внимание, что ошибки обычно не должны быть пойманы; некоторые исключения должны быть. –

ответ

5

Прочитано Java tutorial on Exceptions.

Для краткого объяснения вы можете использовать этот небольшой путеводитель. См. Диаграмму классов с иерархией исключений Java (красный) и несколькими примерами (синий) в каждой категории.

enter image description here

Throwable: общий предок всего, что может быть брошен (и пойманы), используя механизм исключений Java.

Error: вы можете думать о Error с, как о том, что вы называете «неустранимое исключение». Обычно не имеет смысла даже пытаться восстановить приложение. OutOfMemoryError или StackOverflowError являются такими фатальными ошибками, что вы вряд ли можете что-либо сделать в пределах приложения.

Не поймайте Error s, пусть программа выйдет из строя и решит проблему на улице.

RuntimeException: следует использовать для главным образом ошибок программиста (см следующий пример), например, не-отрегулированный нулевой указатель де-ссылки, не выполняет метод контрактов и т.д.

Хотя методы, где все исключения завернуты в RuntimeException s и обрабатываются за пределами бизнес-кода (как правило, с помощью АОП), обычно появление RuntimeException означает, что вы должны позволить программе сбой и исправить исходный код.

/** 
* 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 s и RuntimeException s являются бесконтрольно, что означает, что метод не должен объявить, что он бросает их и абоненты не должны поймать их, т.е. объемного звучания не вызов с try-catch блок.

Другие исключения (унаследованных от Exception и не от RuntimeException): исключения, которые должны быть объявленные (throws...) и пойманных (try-catch), которые в основном предназначены проведение полезной информации от метода к его вызывающий: база данных недоступна, файл не открывается и т. д.

Это исключение, которое должно обрабатываться вашим кодом. Они являются «ожидаемыми исключениями» по сравнению с исключениями времени выполнения, которые являются «неожиданными исключениями».

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 обычно используется в контексте структуры регистратора, e.г. log4j, SLF4J, logback и многие другие. Теперь на поиск в файле журнала можно найти сообщения, как

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)  

Это указует операция вызвала ошибку или исключение произойдет, и это, ошибка или исключение, было зарегистрирована разработчиком с использованием структуры регистратора на СМЕРТЕЛЬНОМ уровне , Сообщение могло быть зарегистрировано на любом уровне.

Log4J, например, предлагает много уровней журнала: OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE, ВСЕ

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

Просто, чтобы вызвать больше путаницы, там уровень журнала называется ERROR.

В заключение, исключение FATAL Vs FATAL error: FATAL - это уровень журнала, на котором был зарегистрирован объект исключения или ошибки, и не имеет отношения к возникновению исключения или ошибки, но когда разработчик регистрируется на уровне FATAL это ловить глаз и вызывать реакцию.

Согласно документу Log4J о том, когда регистрироваться на уровне FATAL «Суровая ошибка, которая предотвратит продолжение приложения».

Смежные вопросы