异常这部分含有的内容并不是很多。首先了解一下,什么是异常,异常都有哪些,再来看看如何捕获异常。
当java提供的异常不够用时如何创建我们自己的异常,我们是怎么样查看异常从哪里抛出, 以及我们应该如何来使用异常机制。
好,开始。
java异常处理概述
java的原则是让有危险的代码不能运行,因此它实现了类似于c++的异常机制。异常一旦发生,会在
堆上创建一个异常对象,终止当前的执行路径,由异常处理机制接管程序,寻找参数与异常类型相匹配的第一个catch,进行处理。
异常的分类
如下图:
|-StackOverflowError
|-VirtualMachineError-----|..........
| |-OutOfMemoryError
|- Error-----| ......
| |
| |-AssertionError
Throwable---| |-ArithmeticException 运算异常,比如整数除0
| |-ClassCastException
| |-RuntimeException----|.......
| | |-IndexOutOfBoundsException
| | |-NullPointerException
|-Exception---| .......
|-SQLException
| |-EOFException
|-IOException---------|....
|-FileNotFoundException
上面这些都是常用的异常了,看着很多,其实只分三类:
- Error.系统或者虚拟机错误,不需要程序员关注。
- RuntimeException.运行时异常,也叫为检查异常,为啥叫未检查异常呢,因为在编译的时候不会进行检查,这种异常一般是由变成错误造成的,程序员需要关注。
- 其他的Exception就是检查的异常了,因为如果有可能抛出这些异常的时候编译器会进行检查并给出提示,进行处理或者在方法的后面进行异常说明,告诉调用方法的成员有异常需要处理。
捕获异常
使用try{}catch(Exception e){}进行异常捕获捕获之后会从上往下依次匹配catch,匹配上则执行catch部分的代码。
因为匹配到第一个就会处理,所以我们要尽量把层次高的比如Exception放到最后面,并且通常情况下,catch的越精细越好。
finally
不论是否发生异常都会肯定执行的方法,通常用来关闭在try中打开的资源。
这里有一个问题,是先return还是先finally呢。看代码:
异常的常用的方法
构造器,异常有两个构造器,一个是无参的,因为异常有用的基本上只有名字了,因此不需要传入什么参数。
另一个是带有一个参数的构造器,能够给异常一些附带的信息。
异常的其他方法都是各种异常打印的方式了看例子:
构造器的参数会在getMessage();中打印出来.
printStackTrace()是打印出来异常调用栈轨迹,把你从方法调用的地方带到异常发生的地方。
创建自定义的异常
在程序应用框架中,我们通常会创建一些自定义的异常。因为异常只有类名和附加信息有用所以自定义
要定义自己的异常类最普通的方式是继承一个异常类,最好是相近的异常。还可以对父类中的方法进行覆盖,这样就能够打印自己需要的格式的信息。
是在比较简单就不给出例子了
异常链
通常情况下,如果我们捕获了异常,进行处理之后再抛出,比如在catch方法中加入throw方法,是不会影响异常栈的顺序的。
如果我们想要更新抛出点的信息则需要使用fillInStackTrace()方法了。如:
在异常信息里面加入cause by。
什么时候是用到呢,比如一个方法的方法签名声明了throw A异常。但是这个方法中却调用了可能出现NullPointerException的方法。我们用什么表达A中的异常是因为NullPointerE而出现的呢,就需要使用initCause方法了。
在方法中加入这样的代码:
AException ae = new AException()。
ae.initCause(new NullPointerException);
异常处理原则
异常处理的用法虽然不多,但是用不好却有可能引起很多的问题,我们应该按照一些原则尽量避免问题:
- 注意不要造成异常的吞咽或丢失。比如没有catch只有finally,单单使用了.printSta的方法也不算是处理了异常。
- try块不要太大。是维护的噩梦。
- 异常类型不要太大,比如Exception,越详细越好。
- 在不知道如何处理异常的时候可以不进行处理,把异常往上报,或者是都通过throw new RuningtimeException(e)来把被检查的异常变成未检查的异常。
- 捕获异常后一定要注意在finally中释放资源。
- 要考虑异常对全局的影响,是否会造成返回不完整的数据等等。
本文深入讲解Java异常处理机制,包括异常分类、捕获、自定义异常等核心概念,并探讨异常处理的最佳实践。
1366

被折叠的 条评论
为什么被折叠?



