什么是异常:
程序执行过程中不正常的情况
异常的作用:
增强程序的健壮性
public class ExceptionTest01 {
public static void main(String[] args) {
int a = 10;
int b = 0;
// 实际上JVM在执行到此处的时候,会new异常对象:new ArithmeticException("/ by zero");
// 并且JVM将new的异常对象抛出,打印输出信息到控制台了。
int c = a / b;
System.out.println(a + "/" + b + "=" + c);
// 此处运行也会创建一个:ArithmeticException类型的异常对象。
System.out.println(100 / 0);
}
}
异常在java中以类的形式存在,每一个 异常类 都可以创建 异常对象
public class ExceptionTest02 {
public static void main(String[] args) {
// 通过“异常类”实例化“异常对象”
NumberFormatException nfe = new NumberFormatException("数字格式化异常!");
// java.lang.NumberFormatException: 数字格式化异常!
System.out.println(nfe);
}
}
异常的父类是Exception
异常的分类:
异常分为 编译时异常
和 运行时异常
。
所有异常都是在 运行阶段
发生的。因为只有程序运行阶段才可以 new对象。
因为异常的发生就是 new异常对象
。
异常的处理方式:
throws:在方法声明的位置上使用 throws
关键字抛出,谁调用我这个方法,我就抛给谁。抛给 调用者
来处理。
try...catch:
这个异常不会上报,自己把这个事儿处理了。
异常抛到此处为止,不再上抛了。
注意:
- 只要异常没有捕捉,采用上报的方式,此方法的
后续代码不会执行
。 - try语句块中的某一行出现异常,该行
后面的代码不会执行
。 - try…catch捕捉异常之后,后续代码可以执行。
-
private static void m1() throws FileNotFoundException { System.out.println("m1 begin"); m2(); // 以上代码出异常,这里是无法执行的。 System.out.println("m1 over"); }
try { m1(); // m1方法出异常,下面代码不执行。 System.out.println("hello world!");//不执行 } catch (FileNotFoundException e){ //异常处理 System.out.println("出异常了!!"); System.out.println(e); } System.out.println("hello world"); //会执行
注意:
-
异常发生之后,如果我选择了上抛,抛给了我的调用者,调用者需要对这个异常继续处理,那么调用者处理这个异常同样有两种处理方式。
一般不建议在main方法上使用throws,因为这个异常如果真正的发生了,一定会抛给JVM。JVM只有终止。
一般main方法中的异常建议使用try…catch进行捕捉。 -
finally:无论有没有异常,finally里面的代码都会被执行
自定义异常:
- 第一步:编写一个类继承
Exception
或者RuntimeException
. - 第二步:提供两个
构造方法
,一个无参数的,一个带有String参数的。