java复习–异常
Error:错误,由JVM生成并抛出,如虚拟机错误,程序不做处理(少见)。
1
Exception:所有异常类的父类(可以处理的错误)。
2
RuntimeException
未检查(unchecked)异常
经常出的错误
不能由编译器检查,编程导致的错误,程序员的错误,编程避免。
注意:
可处理可不处理
3
RuntimeException举例
数组访问越界IndexOutOfBoundsException
访问空指针 NullPointerException
算术异常 ArithmeticException
类转换异常 ClassCastException
4
非Runtime Exception
已检查(checked)异常
有时在特定条件下发生的错误,如试图读取磁盘上不存在的文件
能够用Java编译器进行分析,编译时检查,提高了程序的安全性
非RuntimeException举例
输入输出异常IOException
解析异常ParseException
注意:
必须有相应处理
5
创建异常对象:程序运行出现非正常情况时,系统将错误信息封装为一个Exception对象
抛出异常对象:系统将这个异常对象抛出给发生异常的位置
接收处理异常对象:程序接收异常对象并处理
继续抛出异常对象:如果无法处理则继续抛出
6
try…catch…语句
catch子句
调用某个catch块处理异常对象时,会将异常对象赋值给catch块后的异常形参,包含异常对象的信息
getMessage():得到异常的详细描述字符串
printStackTrace():输出异常的跟踪栈信息(用于调试程序)
printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流
getStackTrace():返回异常的跟踪栈信息
一般题目只让System.out.println(e);即可
7
注意逻辑顺序;
子异常要写在父异常前面!
8
finally子句
不管异常是否发生,finally子句的代码都会执行。
作用:为异常提供了统一的出口,使得在控制流程转到程序其他部分之前,做统一的处理。
finally中通常所做的工作:
关闭打开的文件;
关闭数据库连接;
其它
例子:
FileInputStream in = null;
try {
in = new FileInputStream("1.txt");
int b;
while ((b = in.read())!=-1)
System.out.print((char)b);} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in!=null)
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
9
注意throws与throw的区别!!!
throws用于方法的抛出异常的声明,
参数列表之后,{}之前;
eg:
public static void f()throws Exception
{
//....
}
而throw用于方法内部抛出某个具体的异常;
eg:
public void f()throws Exception
{
try{
//....
}catch(Exception e){
throw new Exception("exception message");
}
}
10
可以自定义异常;
但必须继承自Exception
提供构造器,通过super向上传参,初始化Exception中的message;
也可通过getMassage()调用message;
11
小总结:
java异常处理:一种用于处理程序中错误的机制
创建异常对象:程序运行出现非正常情况时,系统将错误信息封装为一个Exception对象 XXXException e = new XXXException(“…”)
抛出异常对象:系统将这个异常对象抛出给发生异常的位置 throw e;
接收处理异常对象:程序接收异常对象并处理 try…catch…finally
继续抛出异常对象:如果无法处理则继续抛出 throws XXXException
不过度使用异常
使用异常机制处理一切错误,对于普通的程序逻辑
不编写任何错误处理代码,而是简单抛出异常来代替错误处理
用异常处理来代替流程控制
不使用过度庞大的try块
否则catch块数量太多,逻辑混乱
避免catch All异常
关键异常可能忽略
不能针对不同异常分别处理
不要忽略捕捉到的异常
应当处理并修复这个错误!仅打印信息不够
处理异常、重新抛出新异常、在合适的层处理异常