我知道错误 [运行时错误]和例外之间的区别。{谈论JAVA }。 但是致命错误和异常是相同的事情还是它们是不同的。或者java中没有致命错误的概念? 我搜索谷歌,但它很混乱。
答案 0 :(得分:6)
阅读Java tutorial on Exceptions。
简短说明您可以使用这个小指南。请参阅每个类别中带有Java异常层次结构(红色)和几个示例(蓝色)的类图。
Throwable
:使用Java异常机制抛出(和捕获)的任何东西的共同祖先。
Error
:您可能会考虑Error
关于您所说的内容"致命异常"。即使尝试恢复应用程序通常也没有意义。 OutOfMemoryError
或StackOverflowError
是致命错误,您无法在应用程序中执行任何操作。
不要抓住Error
,让程序崩溃并解决外面的问题。
RuntimeException
:应该主要用于程序员的错误(请参阅下面的示例),例如未处理的空指针de-参考,不履行方法合同等。
虽然它们是将所有异常包装到RuntimeException
并在业务代码之外处理(通常使用AOP)的技术,但通常出现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
和RuntimeException
都取消选中,这意味着方法不必声明它会抛出它们而调用者不必捕获它们,即没有用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 :(得分:1)
单词FATAL通常用于记录器框架的上下文中,例如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)
这表明操作导致发生错误或异常,并且开发人员使用FATAL级别的记录器框架记录了错误或异常。该消息可能已在任何级别记录。
Log4J例如提供了许多日志级别:OFF,FATAL,ERROR,WARN,INFO,DEBUG,TRACE,ALL
http://logging.apache.org/log4j/2.x/log4j-api/apidocs/org/apache/logging/log4j/Level.html
只是为了引起更多的混淆,有一个名为ERROR的日志级别。
总结一下,FATAL异常与FATAL错误: FATAL是记录异常或错误对象的日志级别,与发生的异常或错误无关,但是当开发人员在FATAL级别登录时,它会引起您的注意并引起反应。
根据Log4J的文档,关于何时登录致命等级 "严重错误,将阻止应用程序继续。"