1.java异常分为两类:编译时异常(checked)和运行时异常(RuntimeException)。
RuntimeException:这种异常时不确定的,不用抛出,编译可以正常通过,例如:1/0
Checked:这种异常需要try—catch或者在方法中throw异常让上级来处理,例如:在程序中写文件操作函数
2.异常处理原则和技巧
1、避免过大的try块,不要把不会出现异常的代码放到try块里面,尽量保持一个try块对应一个或多个异常。
2、细化异常的类型,不要不管什么类型的异常都写成Excetpion。
3、catch块尽量保持一个块捕获一类异常,不要忽略捕获的异常,捕获到后要么处理,要么转译,要么重新抛出新类型的异常。
4、不要把自己能处理的异常抛给别人。
5、不要用try...catch参与控制程序流程,异常控制的根本目的是处理程序的非正常情况。
6、捕获异常时先捕获小异常,再捕获大异常
3.java7 新属性
1.捕获多种类型的异常时,多种异常类型之间用竖线(|)隔开
2.捕获多种异常时,异常的变量有隐式的final声明,所以不能对异常变量重新进行赋值
例如:
public class MultiExceptionTest{ public static void main(String[ ] args){ try{ int a = Integer.parseInt(args[0]); int b = Integer.parseInt(args[1]); int c = a / b; System.out.println("输入两数相除结果:" + c); }catch(IndexOutOfBoundsException | NumberFormatException | ArithemticException ie){//(1) System.out.println(“程序发生了数组越界、数字格式异常、算数异常之一”); //捕获多异常时,异常变量默认有final修饰 //所以下面代码有错 ie = new ArithmeticException("test");//(2) }catch(Exception e){ System.out.println("未知异常"); //捕获一种类型的未知异常时,异常变量没有final修饰 //所以下面代码完全正确 e = new RuntimeException("test");//(3) } } }
4、注意事项
1.除非在try块,catch块中调用了退出虚拟机(system.exit(1);)的方法,否则不管在try块,catch块中执行了怎样的代码,出现怎样的情况,异常处理的finally块总被执行
2.一旦在finally块中使用了return或throw语句,将会导致try块,catch块中的return,throw语句失效
3.如果main方法不知道如何处理这种类型的异常,throws异常后会将异常交给JVM处理
4.子类抛出的异常范围要比父类小