异常的产生
异常是程序之中导致程序中断的一种指令流,异常一旦出现并且没有进行合理处理的话,那么程序就将中断执行。 我们要做的是即使程序出现了异常,也要让程序在可控范围内正确的执行完毕。
Java异常类继承结构
Java所有的异常类型最高的继承类是Throwable,Throwable下有两个子类:
1. Error:指的是JVM错误,这个时候的程序并没有执行,无法处理;
2. Exception:指的是程序之中出现的错误信息,可以进行异常处理。通常只对Exception进行处理。
try、catch、finally结构
机构如下:
try {
可能出现异常的语句 ;
} [ catch (异常类型 异常对象) {
处理异常 ;
} catch (异常类型 异常对象) {
处理异常 ;
} ... ] [finally {
不管是否出现异常,都执行此代码 ;
}]
- 当try内语句产生异常之后,那么JVM根据异常的类型,实例化一个指定异常类的对象;
- 首先异常类对象会与catch一个个匹配,匹配成功则执行相应的catch内语句,接下来执行finally(如果有)中的语句,之后程序继续往下执行。
- 没有catch将会查找是否有finally(事实上一般情况下try之后必须跟上catch操作,否则编译不通过),有则执行finally,之后程序继续往下执行。
程序中没有任何的异常处理操作(没有try),则这个异常类的实例化对象将交给JVM进行处理,而JVM的默认处理方式就是进行异常信息的输出,而后中断程序执行。
- 对一段代码加上try,就等于显示地承诺编译器,对这段代码可能抛出的异常进行捕获而非向上抛出处理。如果是普通异常,编译器要求必须用catch捕获以便进一步处理;如果运行时异常,捕获然后丢弃并且+finally扫尾处理,或者加上catch捕获以便进一步处理。
- 当try块存在多条语句,如果当前语句抛出异常,接下来的语句将不会执行;
public static void main(String[] args) {
File f = new File("");
try {
f.createNewFile();
System.out.println("123");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("IOException");
// e.printStackTrace();
} finally {
System.out.println("finally");
}
}
运行结果如下:
- 同常调用printStackTrace()方法进行异常信息的打印,这个方法将打印是完整的异常信息。
异常处理流程:
throws关键字
throws关键字主要是在方法定义上使用的,表示的是此方法之中不进行异常的处理,而交给被调用处处理(向上抛出)。
public static void main(String[] args) {
try {
createFile();
} catch (IOException e) {
System.out.println("IOException");
// TODO Auto-generated catch block
// e.printStackTrace();
}
}
public static void createFile()throws IOException {
File f = new File("");
f.createNewFile();
}
main方法上throws将继续向上抛,交给JVM进行异常的处理,也就是采用默认的方式,输出异常信息,而后结束程序执行。
throw关键字
在方法体内使用,表示人为的抛出一个异常类对象(这个对象可可以是自己实例化的,也可以是已存在的,通常用自定义异常)。
try {
throw new Exception("我的异常");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
RuntimeException类
Java中规定,对于RuntimeException的异常类型,在编译的时候不会强制性的要求用户处理,用户可以根据需要有选择性的来进行处理,在开发之中,如果没有处理,那么出现异常之后将交给JVM默认进行处理。也就是说,RuntimeException的子异常类,可以由用户根据需要有选择性的来进行处理。
常见的RuntimeException子类
RuntimeException:
- NumberFormatException
- ClassCastException
- NullPointerException
- ArithmeticException
- ArrayIndexOutOfBoundsException。
引用
感谢大神们无私分享的精神和辛勤的劳动,使我在学习的道路上得到了巨大的帮助和解除困惑。
[1]. Java 异常的捕获与处理详解(一)
[2]. Java 异常的捕获与处理详解(二)
[3]. Java 发生异常,仍然向下执行注意事项 - 感受微风 - ITeye技术网站