我几乎是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 类继承的类的名称。处理程序可以使用名称引用异常。