有道云笔记 连接:
http://note.youdao.com/noteshare?id=bac76e412bc224421df02109ac3bacca
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下可忽略:
《异常处理Exception 1》
异常:运行期出现的错误。
区别于编译期间的语法错误,标点的全半角等。
往往是程序与用户交互时,由于用户的某一操作、输入值等,使程序运行产生错误。
调试:“Java程序不是写出来的,是调试调出来的。”
就是程序在编译、运行、测试时报错,改错,再出错改错的过程。
注意,观察错误的名字和行号最重要。
Java处理Exception的方式:
当程序运行到某处,JVM检测到某错误,如数组下标越界(注意C语言等不会报错,安全性不如Java);它会把错误相应的Exception类,这里即ArrayIndexOutOfBoundsException,抛出(throws);如果程序不捕获此异常,则直接抛出到显示界面,提示错误信息。这样任由错误抛出显示出来,不利于用户理解,要尽量catch。
《异常Exception_2》
1. 方法后加throws ***Exception,用来注明该方法可能抛出的异常。
eg:java.io.File类的方法public void read() throws IOException;
构造方法public FIle(String url)会抛出 NullPointerException;
随之,在方法体里面需手工加上:在什么情况下初始化并抛出这个异常对象。
eg:if(。。。。){
throw new IOException(“异常”);
}
最后,在此方法被调用时,需被try...catch块包围,捕获并定义怎么处理该异常。
2. 异常的分类
Throwable:根父类。
Error:JVM错误,不可捕捉。
RuntimeException:一些极常见的Exception,抛出后可不catch,以提编程成效率。
其它的Exception:如IOException,一旦在方法体中throws IOException,则在调用此方法时必须catch。
注意1:在使用一些库里面的类时,这个类可能throws了某种非RuntimeException,则在使用时必须try...catch,否则编译时报错。
eg:FileInputStream类在初始化时,必须被try...catch异常FileNotFoundException。
注意2:在一段try...catch块中,可能调用了不止一个throws了某非运行时异常的方法,则需分别catch它们。
注意3:非RuntimeException,必须被捕捉,但可以不处理,再throws出去,供下个调用者处理。
3. finally{...}
finally的内容总会执行,无论try中的方法抛出什么异常,哪里抛出异常。它为异常处理提供统一的出口。
通常finally中语句执行资源清理工作:关闭打开的文件,删除临时文件等。常是:if(文件打开) 文件关闭;
此图,左边:
进入try,执行语句1时出现了SomeException2异常,跳入相应的catch中,然后执行finally的语句。期间:语句2不执行,finally一定会执行。
右边:两个catch{}不执行。
4. catch{}常用的两个方法
getMessage():得到有关异常时间的信息。
printStackTrace():来跟踪异常时间发生时执行堆栈的内容。也就是,如果A方法调用B方法时出现异常,则把A和B的信息都打印出来。包含了getMessage()的内容。
上图,打印的是堆栈信息。应注意和后面的行号。其实提示的一系列信息,都只是某一个错误。
5. 抛出两种以上异常
eg:public void func(String url)
throws FileNotFoundException ,IOException{
...
File f = new File(url);
f.read();
...
}
这个方法抛出了两个异常。可以只抛出IOException,因为FileNotFoundException是其子类。但是,建议写两个,因为便于调用者写对应具体异常的catch方法。良好的编程习惯。
注意:catch的时候两个异常有先后顺序,先FileNotFoundException后IOException。否则捕捉不到FIleNotFoundException。
即:try{
x.Func();
}catch(FileNotFoundException e){
system.out.println(e.getMessage());
}catch(IOException e){
e.printStackTrace();
}
6. catch语句不建议为空
可以catch后什么也不写,但这样的话,一个异常就被永久得忽视掉了,是不好的变成习惯。简单的getMessage()即可。使用log4j的话可以把错误信息输出到log文档里。
注意:main()方法也可throws Exception,这时所有异常被抛给Java运行时系统,默认打印出堆栈信息。最无脑的方法是一直throws Exception,因为都是Exception的子类。
7. 自定义Exception
eg:
8. 重写方法时Exception怎么办?
注意:范围大了,范围小了,数量多了都不行。但是什么异常都不写可以,写的话必须跟父类方法的异常类型完全一样。