JAVA异常
Posted 自由乐土
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA异常相关的知识,希望对你有一定的参考价值。
认识异常
通过阅读本篇文章,你将了解到什么是异常,异常有哪些类型,怎么处理异常,异常体系等
一.异常的背景
常见的异常
1.除以0
执行结果:
2.数组越界异常
执行结果:
3.访问null对象
执行结果:
由此可以看出异常指的就是程序在运行时出现错误时通知调用者的一种机制。
编译时出错和运行时异常的区别:
有些错误是例如:System.out.println拼写错了,写成了system.out.println。此时是编译过程出错,这是“编译期”出错。
而运行时指的是程序已经编译通过得到了.class文件了,再有JVM执行过程中出现的错误。
防御式编程
让问题出现时及时通知程序员的方式有两种:
LBYL:Look Before You Leap.在操作之前就做好充足准备。
EAFP:It is easier to ask forgiveness than permission.事后获取原谅比事前获取许可更容易。简单来说就是先操作,遇到问题再解决。
我们JAVA异常的核心思想就是EAFP
二.异常的基本用法
1.捕获异常
基本语法:
try{
可能出现异常的语句;
}catch(异常类型 异常对象){
异常处理;
}finally{
异常的出口;
}
说明:
(1)try代码块中放的是可能出现异常的代码;
(2)catch代码块中放的是出现异常后的处理行为。
(3)finally代码块中的代码用于处理善后工作,会再最后执行。
(4)其中catch和finally都可以根据情况选择加或不加。
处理异常和不处理异常有啥区别?
1.不处理异常
执行结果:
可以看出456没有显示出来,在第二行异常后,异常后面的代码不会执行,程序就终止了。
2.使用try 和 catch后的程序执行情况。
执行结果:
可以发现,try中出现异常,那么try代码块中的程序就不会继续执行,而是交给catch中的代码来执行。catch执行完毕后会继续往下执行。
关于“调用栈”
方法之间是存在互相调用关系的,这种调用关系我们可以用“调用栈”来描述。在JVM中有一块内存空间称为“虚拟机栈”专门存储方法之间的调用关系,当代码异常的时候,我们就可以使用e.printStackTrance( );的方式查看出现异常代码的调用栈。
3.catch只能处理对应种类的异常
执行结果:
此时,catch语句不能捕获到刚才的异常,因为异常类型不匹配。然后程序就会终止,后面的456没有被显示出来。此时出现的异常时数组越界异常,而此异常没有被catch捕获,那么其就会被JVM进行处理。
4.可以有多个catch语句也可以用一个catch捕获所有异常但是不建议这么使用。
执行结果:
为什么一个Exception的对象可以代表那么多异常呢?
因为Exception类是所有异常类的父类,因此可以用这个类型捕捉所有的异常。在后面会学到异常体系。
5.finall的作用:
finall表示最后的善后工作,例如释放资源。
还有无论是否存在异常,finall中的代码一定会执行到。
有异常时:
无异常时:
6.如果本方法中没有合适的处理异常的方法,就会沿着调用栈向上传递
执行结果:
7.如果向上一直传递都没有合适的方法处理异常,最终就会交给JVM处理,程序就会异常终止。
执行结果:
总结异常处理流程:
1.程序先执行try的代码
2.如果try中的代码出现异常,就会结束try中的代码,看和catch中的异常类型是否匹配。
3.如过找到匹配的异常类型,就会执行catch中的代码。
4.如果没有找到匹配的异常类型,就会将异常向上传递到上层调用者。
5.如果上层调用者也没有处理的了异常,就会继续向上传递。
6.一直到main方法也没有合适的代码处理异常,就会交给JVM进行处理,此时程序就会异常终止。
7.无论是否找到匹配的异常类型,finally中的代码都会被执行到(在该方法结束之前执行)。
抛出异常
除了java内置的类会抛出异常外,程序员也可以手动抛出某个异常。使用throw关键字就可以完成这个操作。
案例:
执行结果:
在这个代码中,我们可以根据实际情况来抛出需要的异常。在构造异常对象的同时·可以指定一些描述性信息。
异常说明
我们可以使用关键字throws把可能抛出的异常显式的标注在方法定义的位置。这样做可以提醒调用者要注意捕获这些异常。
Java异常体系
(1)顶层类Throwable派生出两个重要子类,Error和Exception
(2)其中Error指的是java运行时内部错误和资源耗尽错误。应用程序不抛出此类应用。这种内部错误一旦出现,除了告知用户并使程序终止外,再无能为力。这种情况很少出现。
(3)Exception是我们程序员所使用的异常类的父类。
(4)java语言规范将生于Error类或RuntimeException类的所有异常称为非受查异常,所有的其他异常称为受查异常。
(5)如果一段代码可能抛出受查异常,那么必须显式进行处理。
(6)对于受查异常的处理有两种方式:一是使用try catch包裹着自己处理
二是声明异常交给JVM处理。
以上是关于JAVA异常的主要内容,如果未能解决你的问题,请参考以下文章