出现异常之后,程序会中断执行(运行时异常如果没有处理,该线程会退出)
即没有catch,只有throw,必然导致最终交给jvm处理,使得程序退出
异常处理流程
运行时异常
运行时异常表现形式:
- 人为throw new NullPointerException();//人为定义throw的原因:可能是即使我不throw,jvm运行到这里发现null的时候也会自动throw。
- 不管:比如int c=10/0;//cxu 实际上JVM在执行到此处的时候,会new异常对象:new NullPointerException(“null”);并抛出(throw),打印信息 // 并且JVM将new的异常对象throw抛出,打印输出信息到控制台了。
运行时异常出现后程序怎么运行:
运行时异常
出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果
没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就
被main()抛出。注意虽然方法声明的地方没有抛运行时异常(throws),但运行时异常不受这个限制,会一直往上层抛,如果过程中没有catch,就最终到jvm那里了。
运行时处理办法:
- 程序中可以选择定义catch捕获处理:那么程序就不会退出
2 . 程序不处理,即有捕获处理这个异常(即没有catch)系统会把异常一直往上层抛,一直到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。
**
编译时异常:
**
由于调用的方法是java源方法,因此会出现throw,这样的话,我们也要throw,并catch;
出现异常后,比如m();这行出现异常(无论是这行手动throw了还是由下一层的throw返回来的),那么程序在这里中断,并开始检查本层下是否有catch、finally、方法名的throws,中断后只会从这三处开始继续执行。
对于:catch、finally:程序执行之后在这层继续向下执行;
对于方法名的throws:本层程序代码均不执行了,跳到上层调用处执行;
注意:return 是返回一个值,throw 是返回一个错误,返回给该方法的调用者。比如:String类的charAt方法就是一个很好的例子
java中的异常
finally –finally的几种情况以及程序执行顺序的具体表现
finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
//即在try中会正常执行,但遇到throw或者return时,暂时不跳转,而先检测有没有catch捕捉,然后执行,再检测有没有finally,有的话先执行它再跳回来继续执行throw或者return