首页 > 编程知识 正文

map底层实现原理(try catch嵌套)

时间:2023-05-05 09:10:52 阅读:74561 作者:187

有这样的步骤

公共类主{ publicstaticvoidmain (字符串[ ] args { new main ) ).call ); ) }公共int call () try ) inta=1/0; }catch(exceptione ) system.err.println ) (exception ); 返回0; } finally {return 4; }}程序执行结果

Java.lang.arithmetic exception :/by zero 4让我们看看用此代码编译的部分字节码。

公共int call (; 描述符: (iflags : ACC _ public code : stack=2,locals=4, args _ size=10: iconst _ 11: iconst _ 023360 idiv : istore _ 143360 iconst _ 45: ireturn 63360 astore _ 17333653650 method Java/io/printstream.println : (ljava/lang/object; ) v 14: iconst _ 015: istore _ 216: iconst _ 417: ireturn 18: astore _ 319: iconst _ 42033: ireturnexcepceporn 如exception0418any61618any中所示,末尾的Exceptions Table为异常表。 例外表中的每条记录都代表一个例外处理器。

from可能发生异常的起点。to可能发生异常的终点。target上述from和to以前发生异常后异常处理者的位置。type异常处理者处理的异常的类信息。 例如,在上面的Exceptions Table中,0-4的位置表示可能发生异常的位置。 0-4位置的指令如下。

0:iconst_1//int型常数值1除以堆栈1: iconst_0 //int型常数值0除以堆栈2:idiv//:istore_1///,堆栈顶部int型数值并且,target为6,在显示异常之后从6位置开始执行.

JVM指令大全

JVM -指令集大全githubs.xyz

异常处理流程

出现异常时,JVM会在当前引发异常的方法中查找异常表,并确定是否由相应的处理程序处理。 如果当前方法的异常表不为空,异常与处理程序的from和to节点匹配,并且type也匹配,则JVM将调用target中的调用方进行处理。 如果在前一个条目中找不到合理的处理者,则继续搜索异常表中的其馀条目。 如果无法处理当前方法的异常表,请向上查找刚调用此方法的被调用方(弹出堆栈处理),然后重复上述操作。 如果所有堆栈帧都已弹出且尚未处理,则将其扔向当前Thread,Thread退出。 如果当前Thread是最后一个非守护程序线程且未处理异常,JVM将停止运行。

在看实例

公共类主(publicstaticvoidmain (字符串[ ] args ) system.out.println ) getint ); }公共静态int getint (() {int a=10; try{system.out.println(a/0 ); a=20; }catch(arithmeticexceptione ) {a=30; 返回a;/* *返回a; 程序运行到此为止时,这里不是返回a; 不是返回30; 此变量a是副本。 *但是,它发现后面有finally,所以继续执行finally的内容,a=40再次返回到以前的返回路径,返回a的副本30 */} finally {a=40; //return a; //这样结果就40了。 }返回a; }结果运行

30

Java finally语句是在return之前执行还是之后执行?

finally语句在return语句执行后、return返回前执行。

finally块中的return语句将复盖try块中的return返回值。

如果return语句未复盖finally语句中的返回值,则原始返回值可能会因finally中的更改而更改,也可能不会更改。

try块中的return语句在异常的情况下不执行,这样具体返回到哪个来观察情况?

如果发生异常,则catch上的返回执行情况与未发生异常时try上的返回执行情况完全相同。

finally 是否一定会执行两种情况下都不运行finally

try模块没有运行。 使用system.exit(0)退出JVM。

throws关键字此关键字主要用于方法声明,表示该方法不处理异常,而是由调用方处理。

运行时间表和运行时间表之间的差异

Integer类: publicstaticintparseint (字符串文本) throws编号mberformatexception

此方法抛出了异常,但在使用时不需要try。 catch捕获处理。

原因:

因为NumberFormatException是RuntimeException的子类,而不是Exception的直接子类,所以如果它是RuntimeException的子类,程序在操作过程中会将try…catch 当然,也可以用try catch处理。

强烈建议高级JAVA架构师博客JAVA架构师修改githubs.xyz

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。