我想知道在Java中是否可以以与异常类似的方式处理错误。我已经看到了无法处理的错误,例如AssertionError,我也尝试在程序中抛出错误并尝试使用catch进行处理,它工作并且下一部分代码也执行了(这是矛盾的到遇到错误的程序应该退出的部分)。是否可以处理很少的错误,而其他一些错误则无法解决。我对此感到困惑,任何人都可以清除我的这个疑问并说明错误和异常之间的区别吗?
package package1;
public class Class1
{
public static void main(String[] args)
{
Class1 cl1=new Class1();
int x=2;
String s = null;
//assert(x<0):"x is not less than zero";
try
{
cl1.workonExceptions();
}
catch (Error e)
{
e.printStackTrace();
}
System.out.println("Not Terminated yet");
}
public void workonExceptions() throws Error
{
try
{
throw new Exception("Exception");
}
catch (Exception e)
{
throw new Error("Exception Again"); }
}
}
答案 0 :(得分:3)
Error
的一些背景:它不是为了捕获;它只会在某事 错误时出现。一个例外是意味着被捕获和处理,因为它可能会偶尔出现,但不应该中断或严重干扰程序的运行,例如除以零。
至于在try...catch
语句中工作,原因是这是Throwable
类的属性。
只有作为此类(或其子类之一)的实例的对象才被Java虚拟机抛出,或者可以被Java throw语句抛出。类似地,只有这个类或其子类之一可以是catch子句中的参数类型。
答案 1 :(得分:1)
如果从方法抛出异常,则编译器需要该方法的调用者捕获异常。
编译器不要求方法的调用者捕获错误,即使从方法抛出也是如此。
调用程序可以捕获异常和错误,并且它们的行为方式相同。如果你有代码说明“继续执行”,我会有兴趣看到它。如果你抛出其中任何一个(都是从Throwable派生的),那么抛出它们的方法的执行就会停止(没有最终的条款,这个规则的一个(咳)异常我不想试着在这篇文章中介绍)。
答案 2 :(得分:1)
Java中的所有错误都是可捕获的,包括AssertionError
,尽管不建议捕获它们,并且不能保证JVM处于足够一致的状态以便在Error
之后继续执行。所以你看到的是完全正常的。
与C#不同,即使ThreadDeath
的处理方式与其他任何Throwable
完全相同(也就是说,它可以被捕获和使用)。
错误和异常之间的主要区别在于,无论异常说明符如何,方法都可以抛出任何错误。