Java—如何运行try和catch异常处理

Java—如何运行try和catch异常处理,java,exception-handling,Java,Exception Handling,我对Java编程几乎是个新手,我试图了解try and catch异常处理是如何运行的 我的疑问是,当我创建一个定制的异常类并将其抛出到一个主类的try块中时,我可以在不引用的情况下实例化它,但当我编写catch块时,我可以使用实例化异常类的同一类型的成员而不实例化它 例如: public void main.....{ ..... try{ if(division==0){ throw new DivisionByZero() ; //Di

我对Java编程几乎是个新手,我试图了解try and catch异常处理是如何运行的

我的疑问是,当我创建一个定制的异常类并将其抛出到一个主类的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来实例化它。 在我抛出异常(即使我没有在try块中写入任何引用)之前,e是否以某种方式实例化过


提前感谢您的回答

您正在创建一个新对象:

throw new DivisionByZero() ;
投掷/抓捕只是一种“交通工具”。在“本质”上,它就像写作:

DivisionByZero dbz = new DivisionByZero() ;
dbz.someMethod();

创建一个异常,抛出“it”,捕捉“it”,然后“it”只是对某个对象的引用

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

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

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

throw new DivisionByZero() ;` this is equal to 
DivisionByZero dBZException = new DivisionByZero() ;
throw dBZException;
这意味着您正在将一个实例传递给catch块,在该块中您有class
DivisionByZero
的引用变量

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

DivisionByZero e = dBZException;
希望现在清楚了

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

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

你可以看到,如果你看一下:

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


当你说
throw new division by zero
时,你是在实例化自定义异常。当你定义catch块时,你只是告诉编译器将捕获什么类型的异常,而不是在那里实例化它们。throw/catch只是一种“传输方式”。很好的解释谢谢大家。非常有意义的回答。多亏了你的回答,我在Java编程方面稍微有点专业了。