如何在catch块中创建对象?



一般我们使用"new"关键字来创建对象,我知道(String s = "Hello")也会创建一个对象,但在catch块中它只是提到了catch(ArithmeticException e)。为什么e是一个物体呢?

public static void main(String[] args) {  
try  {  
int data=50/0; //may throw exception   
}  
//handling the exception  
catch(ArithmeticException e)  {  
System.out.println(e);  
}  
System.out.println("rest of the code");  
}        
}  

try块中的代码在抛出算术异常类型时,对象是在运行时创建的。因此,在catch块中,变量e在运行时成为对象。

我相信您是在问如何在您的示例中创建ArithmeticException。(在这种情况下,您显然没有显式地使用new来创建它。)

答案是JVM创建了它。当JVM检测到出现整数除以零时,它创建一个ArithmeticException实例,并使用消息字符串"divide by zero";(或诸如此类),然后将其抛出。

Q:它如何检测除零,如何创建和抛出异常?

A:所有这些东西都是特定于实现的1。但是,如果反汇编字节码,您将看不到任何特定的字节码指令来执行此操作。它发生在一个较低的层次。从概念上讲,它发生在除法指令内。

无论如何,ArithmeticException对象确实被创建了,然后异常处理程序将它绑定(分配)给e变量。


1 -例如,在某些硬件上,整数除以0触发中断。这将被操作系统异常处理程序捕获,并向JVM发出信号。最终,信号处理程序(在JVM的深处)找出是哪个线程做的,创建异常对象并"抛出";它。这是一种混乱复杂的低级东西……

最新更新