致命错误和非致命运行时错误有什么区别?

时间:2019-07-18 13:43:18

标签: java

“致命的运行时错误导致程序 立即终止,但未成功执行其致命任务 运行时错误使程序运行完成,经常产生 结果不正确” 我已经阅读了这些信息,但是我需要一些示例来进一步说明该概念...

2 个答案:

答案 0 :(得分:1)

例如,OutOfMemoryError很难恢复(即使有可能),而通过将信息返回给用户则很容易处理IllegalArgumentException

答案 1 :(得分:1)

诸如OutOfMemoryError,VirtualMachineError之类的致命错误通常不采取恢复操作。

Docs说:

错误是Throwable的子类,它指示严重的问题,而合理的应用程序不应尝试抓住这些问题。大多数此类错误是异常情况。 ThreadDeath错误虽然是“正常”情况,但它也是Error的子类,因为大多数应用程序都不应尝试捕获它。 不需要方法在其throws子句中声明可能在方法执行期间抛出但未被捕获的Error的任何子类,因为这些错误是不应该发生的异常情况。也就是说,出于编译时检查异常的目的,Error及其子类被视为未经检查的异常。

例如,如果您运行的递归任务没有执行中断的基本条件。

int recursiveSum(int n){
        return n + recursiveSum(n+1);
    }

您遇到StackOverFlowError,这意味着您已填满堆栈,并且JVM无法继续正常执行程序。

就像另一个示例一样,由于硬件或Internet连接问题,可能会出现错误。

但是检查异常通常是程序的正常行为。它为使用您的应用程序的用户定义了约束。