一、说明
(1)异常是指程序在运行过程中发生由于算法考虑不周或软件设计错误等导致的程序异常事件。Java提供的异常处理机制是通过面向对象的方法来处理异常的。所以在Java中所有异常都是以类的形式存在的。
(2)Java有内置异常类和用户自定义异常类。
- 内置异常类
Java是以面向对象的方式来处理异常的,所有的异常类都继承自Throwable类。该类又派生出了两个子类java.lang.Error和java.lang.Exception。
- Error:由系统保留,因为该类定义了那些应用程序通常无法捕捉到的错误。即Java系统内部的错误,即Error类及子类的对象是由Java虚拟机生成并抛出给系统的。一般为内存溢出错、栈溢出错、动态链接错。
- Exception:提供应用程序使用,是用户程序可以捕捉到的情况。
二、Java异常处理方式
Java处理异常通过try、catch、finally、throw、throws五个关键字实现。
- 1.try-catch-finally语句捕获异常
1
2
3
4
5
6
7
8
9
10
11
12try
{
要检查的语句序列
}
catch(异常类名 形参对象名)
{
异常发生时处理的语句,一般为输出异常的相关信息
}
finally
{
一定会运行的语句序列
}
先检查异常、有异常的话捕获异常对象抛出,最后运行finally语句。一般finally语句中放关闭数据库或输入输出的语句。
- 2.try-catch-catch-…….-funally语句,多异常处理
1 | try |
其中异常捕获的次序是按照catch从上向下,所以对于设计该类异常处理时要注意,将处理较具体、较常见的catch放前面,而可以与多种异常类型相匹配的catch块放在较后的位置。若将子类异常的catch语句块放在父类异常catch语句块的后面则编译不通过。
还有就是只要抛出一个异常,就不会继续找下去。
注意:当catch中含有System.exit(0)时,则不执行finally块中的语句,程序直接终止,当catch块中含有return语句时则执行完finally块中的语句后再终止程序。
- 3.异常的抛出throw与throws
(1)throw1
throw 由异常类所产生的对象
其中“由异常类所产生的对象”是一个从Throwable派生的异常类对象。
(2)throws1
[修饰符]返回值类型 方法名([参数列表]) throws 异常类列表
其中,throws是关键字,“异常类列表”是方法中要抛出的异常类,当异常类多于一个时用“,”隔开。
注意:使用这两种方式,在方法中就不用写try-catch-finally语句,当然一般会用,比如throw一个异常时,可以用catch捕获。
- 4.自定义异常类
(1)声明一个新的异常类,用户自定义的异常类必须是Throwable类的直接或间接子类,Java推荐以Exception类为直接父类。当然也可以用自己定义的异常类做父类。
(2)为用户自定义的异常类定义属性和方法,或覆盖父类的属性和方法,使这些属性和方法能够体现该类所对应的错误信息。习惯上是加两个构造方法,一个有参一个无参,有参是含有字符串型参数的构造方法。1
2
3
4
5
6class ExampleException extends Exception{
ExampleException(){}
public String toString(){}
}
自定义异常类的作用:应对特有的异常,使系统具有更好的容错性,使系统更加稳定。
三、小结
- 1.异常类可以分为两大类:java.lang.Exception和java.lang.Error
- 2.程序代码没有编写异常处理时,Java语言的默认异常处理机制是:
(1)抛出异常
(2)停止程序的执行 - 3.当异常发生时,有两种处理方式:
(1)交由Java语言默认的异常处理机制来处理
(2)自行编写try-catch-finally语句来捕获异常 - 4.try语句块若有异常发生时,程序便会中断执行,抛出“由异常类所产生的对象”,并按下列步骤来运行:
(1)抛出的对象如果属于catch()括号内所欲捕获的异常类,catch会捕获此异常,然后进入catch语句块中执行。
(2)无论try语句块是否捕获异常,或异常是否与catch()括号中的异常相匹配,最后一定执行finally块中的语句。
(3)finally块运行结束后,程序转到try-catch-finally语句块之后的语句继续执行。 - 5.RunException可以不编写异常处理代码,仍然可以编译成功,它是程序运行时才又可能发生的;而IOException一定要进行异常捕获处理才行,它通常用来处理与输入输出有关的操作。
- 6.catch()括号内只接收由Throwable类的子类所产生的对象,其他都不接受。
- 7.抛出异常有下列两种方式:
(1)系统自动抛出异常
(2)指定方法抛出异常 - 8.方法中没有使用try-catch语句来处理异常,可在方法声明的头部使用throws语句或在方法内部使用throw语句将它送往上一层调用机构去处理。(去找相应的类或者自定义的返回语句)
注意:
1.运行时异常:即RuntimeException及其之类的异常。这类异常在代码编写的时候不会被编译器所检测出来,是可以不需要被捕获,但是程序员也可以根据需要进行捕获抛出。常见的RuntimeException有:NullpointException(空指针异常),ClassCastException(类型转换异常),IndexOutOfBoundsException(数组越界异常)等。
2.编译时异常:RuntimeException以外的异常。这类异常在编译时编译器会提示需要捕获,如果不进行捕获则编译错误。常见编译异常有:IOException(流传输异常),SQLException(数据库操作异常)等。
添加点名词解释:
1、检查性异常: 不处理编译不能通过
2、非检查性异常:不处理编译可以通过,如果有抛出直接抛到控制台
3、运行时异常: 就是非检查性异常
4、非运行时异常: 就是检查性异常