我正在尝试理解错误和异常之间的区别,但它看起来一样,在Oracle Official tutorials上我读了这一行。
已检查的例外情况受Catch或Specify Requirement的约束。 除了表示的异常外,所有异常都是经过检查的异常 Error,RuntimeException及其子类。
现在关于我的想法是一样的。但经过更多的搜索,我发现了一些理论上的差异。
例外:可以恢复
错误:无法恢复。
例外情况:
try{
read file
}
catch(FileNotFoundException e){
// how I can recover here? can i create that file?
// I think we can just make log file to continue or exit.
}
错误示例:
try{
try to locate memory
}
catch(MemoryError e){
// I think we can just make log file to continue or exit.
}
被修改 我问的是可恢复和不可恢复的。
答案 0 :(得分:4)
错误,正如您已经发现的那样,意味着您遇到了严重的麻烦。在一个catch区块中,您可以执行类似日志记录的操作,但基本上就是这样。
不可恢复的异常主要是运行时异常,例如NullPointerException
,它们通常是程序代码中某些错过检查的结果。因此,解决方案通常是修复代码。
可恢复的异常是您事先知道并且采取某些措施的事情。想想一个调用一些后端服务的Web应用程序。该服务可能或可能不可用,这可能导致操作的执行失败。因此,您有一个已检查的异常,在这种情况下很可能是您通过的自定义异常,然后以您告诉用户的方式在前端代码中处理它,抱歉后端服务xy已关闭,稍后再试或联系支持。 Recoveralbe并不意味着应用程序可以做一些事情来解决异常的原因,尽管可能存在这种情况。
答案 1 :(得分:0)
从类Exception继承但不直接或间接从RuntimeException类继承的所有类都被视为已检查的例外。这些例外通常是由不受程序控制的条件引起的。 实施例
<强>可恢复强> 因此,很容易知道如果文件不存在,那么您不需要打开该文件,因此可以恢复
所有作为RuntimeException(包java.lang)的直接或间接子类的异常类型都是未经检查的异常。这些通常是由程序代码中的缺陷引起的。 实施例
<强>不可恢复强> 因此,为什么程序无法从这些错误或异常中恢复
答案 2 :(得分:0)
不可恢复的错误是将应用程序置于未定义状态的错误,例如断开的数据库连接或关闭的端口,您可以处理错误并继续执行,但这没有意义。 Rust 和 Go 等现代语言使用名称 panic
来表示这些性质的错误,以明确区分。最好的操作是记录错误(如果可能)并退出应用程序。
可恢复的错误是我们可以优雅地处理的错误,例如被零除或验证错误。这是预期的结果,语言规范中涵盖了由此产生的行为。是的,当发生可恢复的错误时,应用程序的行为会不稳定,但我们可以控制它或解决它。