如何在 catch 子句中,当我没有创建任何期望时,正在记录一个期望的实例


try{Integer.parse("Abhishek");}
catch(NumberFormatException e){}
catch(Exception e){}
如果

对于上述代码段,如果发生 NumberFormatException,它将立即转到 NumberFormatException 的捕获原因。但是我没有创建任何NumberFormatException...的实例,然后在哪里创建它。是不是像——一旦发生任何异常,JVM就会在内部检查异常的类型,并在内部创建该特定异常类型的一个实例,一旦它在catch层次结构中注册或找到任何匹配的类型,它就会进入该循环

但我没有创建任何数字格式异常的实例...

 Integer.parseInt("Abhishek");

如果无法将字符串解析为 int,该方法将引发 NumberFormatException。这在Javadoc中有记录。

一旦发生任何异常,

JVM就会在内部检查异常的类型,并在内部创建该特定异常类型的一个实例,一旦它在catch层次结构中注册或找到任何匹配的类型,它就会进入该循环

或多或少。。。

不过,这并没有真正深入到JVM内部。Integer#parseInt 是用 Java 实现的,就像你自己的程序一样。如果您有兴趣,可以查看源代码。

到目前为止,

每个人都错过了解释的是,在Integer.parseInt()代码中的某个地方有这样一条语句:

throw new NumberFormatException(...)

这是创建和抛出异常的点。 您可以查找源代码并找到该语句。

NumberFormatException 对象是在 IntegerparseInt 方法中创建的。(没有Integer.parse(String)方法。

当抛出异常时,JVM 使用 Java 语言规范的 §14.20.1 中描述的一组特定规则来选择要执行的匹配catch子句。主要规则是:

如果 V 的运行时类型与 try 语句的任何 catch 子句的可捕获异常类 (§5.2( 赋值兼容,则选择第一个(最左边的(此类 catch 子句。

是的,JVM创建异常的实例。你回答了你自己的问题...

该方法parse()创建异常实例,并在认为出现问题时引发它。当你捕获它时,你(几乎总是(捕获parse()方法创建和抛出的实例。

最新更新