Java - 如何尝试和捕获异常处理运行



我几乎是Java编程的新手,我试图理解尝试和捕获异常处理是如何运行的。

我的疑问是,当我创建一个自定义的异常类并将其扔到主类的 try 块中时,我可以在没有引用的情况下实例化它,但是当我编写 catch 块时,我可以使用相同类型的实例化异常类的成员而不实例化它。

例如:

public void main.....{
.....
 try{
    if(division==0){
         throw new DivisionByZero() ;
         //Divisionbyzero is my customized exception class
     } 
 }
catch(DivisionByZero e) {
   e. methodDivisionByZero;
 }
}

关键是我可以直接使用 e 成员,而无需通过 new 实例化它。当我抛出异常时,e 是否以某种方式实例化(即使我没有在 try 块中编写任何引用)?

提前感谢您的任何答案。

抛出异常时,将创建一个异常对象,并且不会在 try 块中执行更多行。此异常对象与 catch 块参数匹配,最合适的对象像方法参数一样接收参数变量中的对象。在这种情况下catch(DivisionByZero e)catch(ArithmeticException e)正确的 catch 子句以捕获除以零异常,参数 e 是对异常对象的引用。

对于您的第一个问题,我可以在没有引用的情况下实例化它:没有必要将实例分配给任何引用变量。我们使用引用变量,以便将来可以使用它的成员。

对于第二个问题,我可以使用相同类型的实例化异常类的成员而不实例化它: 当你在写的时候

throw new DivisionByZero() ;` this is equal to 
DivisionByZero dBZException = new DivisionByZero() ;
throw dBZException;

这意味着您将一个实例传递给 catch 块,其中您有类 DivisionByZero 的引用变量。

因此,在 catch 块中,您的代码工作方式如下:

DivisionByZero e = dBZException;

希望现在清楚了。

您正在创建一个新对象:

throw new DivisionByZero() ;

投掷/接球只是一种"交通工具"。在"本质"中,就像写:

DivisionByZero dbz = new DivisionByZero() ;
dbz.someMethod();
你创建一个异常,你抛出"it",你捕获"it"

,然后"it"只不过是对某个对象的引用。

关键是我可以直接使用 e 成员,而无需通过 new 实例化它。

好吧,您在这里不需要任何实例,在catch块中,例如在方法调用中,我们传递了一个**[reference][1]**,这是对应该处理的异常的引用。

如果你看一下 捕获块 Oracle 文档 :

每个 catch 块都是一个异常处理程序,用于处理其参数指示的异常类型。参数类型 ExceptionType 声明处理程序可以处理的异常类型,并且必须是从 Throwable 类继承的类的名称。处理程序可以使用名称引用异常。

最新更新