1.在java中,如果某个方法不能够采用正常的途径完整他的任务,就可以通过另外一个路径退出方法。在这种情况下,方法并不返回任何值,而是跑出一个封装了错误信息的对象。注:这个方法将会立刻退出,并不返回任何值。另外,调用这个方法的代码也将无法继续执行,而是,异常处理机制开始搜索能够处理这种异常状况的异常处理器。
2.异常的分类如下图:
注:(1)java语言规范将派生于Error类或RuntimeException类的所有异常称为未检查异常,将其他异常成为已检查异常。
(2)派生于RuntimeException的异常包含下面几种情况
*错误的类型转换
*数组访问越界
*访问空指针
3.遇到下面4种情况是应该抛出异常(用throws子句声明异常):
(1)调用一个抛出一件产异常的方法,例如:FileInputStream构造器
(2)程序运行过程中发现错误,并且利用throw语句抛出一个已检查异常。
(3)程序出现错误,例如a【-1】=0会抛出一个ArrayIndexOutOfBoundsException这样的未检查异常。
(4)java虚拟机和运行时库出现的内部异常
注:对于那些可能被他人使用的java方法,应该根据异常规范,在方法的首部声明这个方法可能抛出异常。如:
class MyAnimation {
public Image LoadImage (String s) throws IOException,EOFException {
....
}
}但不需要声明java的内部错误,即从Error继承的错误,也不应该声明从RuntimeException继承的那些未检查的异常。
4.如果类中的一个方法声明将会抛出一个异常,,而这个异常是某个特定类的实例时,则这个方法就有可能抛出这个类的异常,或者这个类的任意一个子类的异常。
5.如果在子类中覆盖了超类的一个方法,子类方法中声明的已检查异常不能超过超类方法中声明的异常范围。如果超类方法没有抛出任何已检查异常,子类也不能抛出任何已检查异常。
6.抛出异常的语句:throw new EOFException()或EOFException e = new EOFException();throw e;
7.抛出异常的过程
(1)找到一个合适的异常类。
(2)创建这个类的一个对象
(3)将对象抛出
8.创建异常类只是定义一个派生于Exception的类,或者派生于Exception子类的类。习惯上,一个是默认的构造器;另一个是带有详细描述信息的构造器。
9.捕获异常必须设置try/catch语句块。如下
try{}catch(Exception e) {}
注:如果在try语句块中的任何代码抛出了一个在catch子句中说明的异常类,那么
(1)程序将跳过try语句块的其余代码。
(2)程序将执行catch子句中的其余代码。
如果在try语句块中的代码没有抛出任何异常,那么程序将跳过catch子句。
如果方法中的任何代码抛出了一个在catch子句中没有声明的异常累心,那么这个方法就会立刻退出
可以使用e.getMessage()得到对象更多的信息或者使用e.getClass().getName()得到异常对象的实际类型
10.不管是否有异常被捕获,finally子句中的代码都被执行。
11.分析堆栈跟踪元素
(1)可以调用Throwable类的printStackTrace方法访问堆栈跟踪的文本描述信息。
(2)可以调用getStackTrace方法获得一个StackTraceElement对象的数组,并在程序中对它进行分析。
如:Throwable t = new Throwable();
StackTraceElement[] frames = t.getStackTrace();
for(StackTraceElement frame:frames) {
analyze frame;
}
(3)静态的Thread.getAllStackTrace方法,它可以产生所有线程的堆栈跟踪。
如:Map<Thread ,stackTraceElement[]> map = Thread.getAllStackTraces();
for(Thread t:map.keySet()) {
StackTraceElement[] frames = map.get(t);
analyze frames;
}