第 9章 异常处理
9.1 异常与异常类
9.2 抛出异常
9.3 异常的捕捉及处理
9.4 finally语句
9.5 习题
9.1 异常与异常类
异常是指程序运行过程中出现的非正常事件。
Java语言的异常处理机制可以将具体操作代码和异常处理代码分开,在一个地方集中处理异常。
9.1 异常与异常类(续)
Throwable:
–Error
代表系统错误。
–Exception
代表可能从任何 Java方法或运行期偶发事件中掷出的异常。
9.1 异常与异常类 (续)
Exception异常:
ClassNotFoundException 未找到欲装载的类
FileNotFoundException 未找到指定的文件或目录
IllegalAccessException 非法访问类
InterruptedException 中断异常
IOException 输入、输出错误
MalformedURLException URL格式错误
NoSuchFieldException 没有找到所要的数据域
NoSuchMethodException 没有找到所要的方法
RuntimeException Java解释器执行正常指令时发生错误
UnknownHostException 无法确定主机的 IP地址接口
9.1 异常与异常类 (续)
RuntimeException异常:
ArithmeticException 算术运算错误,如除数为 0
ArrayStoreException 向数组中存入的数据类型不正确
ClassCastException 类强制转换错误
IllegalArgumentException 方法调用时传递的参数类型错误
IndexOutOfBoundsException 索引值超出范围错误
NegativeArraySizeException 创建的数组元素为负数个错误
NullPointerException 访问空对象错误
SecurityException 安全性错误
ArrayIndexOutOfBoundsException 数组越界使用错误
StringIndexOutOfBoundsException 字符串索引值超出范围错误
IllegalThreadStateException 执行线程不合规定
NumberFormatException 字符串转换为数值时发生错误
9.1 异常与异常类 (续)
Exception类的构造方法:
–public Exception()
–public Exception(String s)
Throwable类的成员方法:
–String getMessage()
–String toString()
–void printStackTrace()
9.1 异常与异常类 (续)
自定义异常类:
class MyException1 extends Exception{}
class MyException2 extends Exception
{
public String toString()
{
return "MyException2 thrown";
}
}
9.2 抛出异常
static int f(int a,int b) throws
MyException1,MyException2
{
if(a<0) throw new MyException1();
if(b<0) throw new MyException2();
int c=a/b;
return c;
}
9.3 异常的捕捉及处理
try{
可能抛出异常的程序代码
}
catch(Type1 id1)
{
对 Type1类异常进行处理的代码
}
catch(Type2 id2)
{
对 Type2类异常进行处理的代码
}
……
catch(TypeN idN)
{
对 TypeN类异常进行处理的代码
}
9.3 异常的捕捉及处理(续)
例 9-2 异常处理
SumUpException 0
SumUpException 10
SumUpException 5.6
SumUpException 5 2
源代码运 行运 行运 行运 行
9.3 异常的捕捉及处理(续)
catch模块与抛出的异常匹配的条件:
– 异常与参数属于同一异常类。
– 异常的类型是参数类型的子类。
– 异常的类型实现了参数接口。
9.3 异常的捕捉及处理(续)
例 9-3 RuntimeException异常的自动处理
Divide -10 2
Divide 10 2
Divide 10
Divide 10 0
源代码运 行运 行运 行运 行
9.3 异常的捕捉及处理(续)
注意,应将较具体或常产生的异常的 catch
模块放在前面,而可以与多种异常相匹配的
catch模块放在较后的位置。如果将基础类异常放在其派生类之前处理,编译器会报告错误。
例 9-4 捕捉并处理所有异常源代码 运 行
9.4 finally语句
try{
可能抛出异常的程序代码
}
catch(Type1 id1)
{
对 Type1类异常进行处理的代码
}
catch(Type2 id2)
{
对 Type2类异常进行处理的代码
}
……
catch(TypeN idN)
{
对 TypeN类异常进行处理的代码
}
finally
{
每次都执行的代码
}
9.4 finally语句(续)
try语句块后至少紧接一个 catch模块或
finally语句。
无论 try语句块内是否抛出异常,相应的
finally语句都被执行。
例 9-5 finally语句的执行源代码 运 行
9.5 习 题
9.1 异常与异常类
9.2 抛出异常
9.3 异常的捕捉及处理
9.4 finally语句
9.5 习题
9.1 异常与异常类
异常是指程序运行过程中出现的非正常事件。
Java语言的异常处理机制可以将具体操作代码和异常处理代码分开,在一个地方集中处理异常。
9.1 异常与异常类(续)
Throwable:
–Error
代表系统错误。
–Exception
代表可能从任何 Java方法或运行期偶发事件中掷出的异常。
9.1 异常与异常类 (续)
Exception异常:
ClassNotFoundException 未找到欲装载的类
FileNotFoundException 未找到指定的文件或目录
IllegalAccessException 非法访问类
InterruptedException 中断异常
IOException 输入、输出错误
MalformedURLException URL格式错误
NoSuchFieldException 没有找到所要的数据域
NoSuchMethodException 没有找到所要的方法
RuntimeException Java解释器执行正常指令时发生错误
UnknownHostException 无法确定主机的 IP地址接口
9.1 异常与异常类 (续)
RuntimeException异常:
ArithmeticException 算术运算错误,如除数为 0
ArrayStoreException 向数组中存入的数据类型不正确
ClassCastException 类强制转换错误
IllegalArgumentException 方法调用时传递的参数类型错误
IndexOutOfBoundsException 索引值超出范围错误
NegativeArraySizeException 创建的数组元素为负数个错误
NullPointerException 访问空对象错误
SecurityException 安全性错误
ArrayIndexOutOfBoundsException 数组越界使用错误
StringIndexOutOfBoundsException 字符串索引值超出范围错误
IllegalThreadStateException 执行线程不合规定
NumberFormatException 字符串转换为数值时发生错误
9.1 异常与异常类 (续)
Exception类的构造方法:
–public Exception()
–public Exception(String s)
Throwable类的成员方法:
–String getMessage()
–String toString()
–void printStackTrace()
9.1 异常与异常类 (续)
自定义异常类:
class MyException1 extends Exception{}
class MyException2 extends Exception
{
public String toString()
{
return "MyException2 thrown";
}
}
9.2 抛出异常
static int f(int a,int b) throws
MyException1,MyException2
{
if(a<0) throw new MyException1();
if(b<0) throw new MyException2();
int c=a/b;
return c;
}
9.3 异常的捕捉及处理
try{
可能抛出异常的程序代码
}
catch(Type1 id1)
{
对 Type1类异常进行处理的代码
}
catch(Type2 id2)
{
对 Type2类异常进行处理的代码
}
……
catch(TypeN idN)
{
对 TypeN类异常进行处理的代码
}
9.3 异常的捕捉及处理(续)
例 9-2 异常处理
SumUpException 0
SumUpException 10
SumUpException 5.6
SumUpException 5 2
源代码运 行运 行运 行运 行
9.3 异常的捕捉及处理(续)
catch模块与抛出的异常匹配的条件:
– 异常与参数属于同一异常类。
– 异常的类型是参数类型的子类。
– 异常的类型实现了参数接口。
9.3 异常的捕捉及处理(续)
例 9-3 RuntimeException异常的自动处理
Divide -10 2
Divide 10 2
Divide 10
Divide 10 0
源代码运 行运 行运 行运 行
9.3 异常的捕捉及处理(续)
注意,应将较具体或常产生的异常的 catch
模块放在前面,而可以与多种异常相匹配的
catch模块放在较后的位置。如果将基础类异常放在其派生类之前处理,编译器会报告错误。
例 9-4 捕捉并处理所有异常源代码 运 行
9.4 finally语句
try{
可能抛出异常的程序代码
}
catch(Type1 id1)
{
对 Type1类异常进行处理的代码
}
catch(Type2 id2)
{
对 Type2类异常进行处理的代码
}
……
catch(TypeN idN)
{
对 TypeN类异常进行处理的代码
}
finally
{
每次都执行的代码
}
9.4 finally语句(续)
try语句块后至少紧接一个 catch模块或
finally语句。
无论 try语句块内是否抛出异常,相应的
finally语句都被执行。
例 9-5 finally语句的执行源代码 运 行
9.5 习 题