1、异常初步
1.1 介绍
程序很可能出现问题,而我们希望程序可以继续执行下去,就需要使用异常处理机制。看一个例子。
public class Beginner {
public static void main(String[] args) {
//int n1 = 4;
//int n2 = 0;
//System.out.println(n1/n2); //这行报错,不能继续往下执行
//System.out.println("执行完毕");
int num1 = 10;
int num2 = 0;
try {
System.out.println(num1/num2);
} catch (Exception e) {
System.out.println("继续执行");
}
}
}
基本概念:Java语言中,对程序执行中发生的不正常现象叫做异常。
1.2 分类
- 异常Exception:代码级别的问题,可以被捕获并进行相应的处理。比如栈溢出StackOverFlow、堆内存溢出OutOfMemory
- 错误Error:JVM级别的严重错误,出现Error会让程序进入不可恢复的状态。
运行时异常,也叫做非受检异常(unCheckedException),有的运行时异常可以不做处理,比较普遍,所以可以暂不处理。
- NullPointerException 空指针异常
- ArithmeticException 数学运算异常
- ArrayIndexOutOfBoundsException 数组下标越界异常
- ClassCastException 类型转换异常
- NumberFormatException 数字格式不正确异常
- 等等
编译时异常,受检异常(CheckedException),必须要在编译前处理的异常。
- SQLException:操作数据库的异常
- IOException:文件操作出现的异常
- FileNotFoundException:文件未找到异常,一般用于IO流
- ClassNotFoundException:类未找到异常
- IllegalArgumentException:参数异常
2、异常处理的方式
两种:
-
throws:抛给上级
-
try...catch...finally:在本级捕获处理
注意:一般catch(异常)时,如果有多级异常,一般要求子类在前,父类在后。
//这样就报错了
public static void main(String[] args) {
try{
int i = 10/0;
}catch (Exception e){
e.printStackTrace();
}catch (RuntimeException e){
e.printStackTrace();
}
}
复制代码
编译时异常,程序必须处理,运行时异常,如果不处理就是throws异常。
子类重写父类方法时,对父类型抛出的异常的规定:子类型重写方法,所抛出的异常类型要么和父类抛出的异常一致,要么是父类抛出异常的子类型。
throw和throws:
3、自定义异常
让自己定义的类去继承Exception或RuntimeException类。
- 继承Exception类的是编译时异常
- 继承RuntimeException类的是运行时异常
定义一个异常:
public class SelfDefinitionException extends Exception{
public SelfDefinitionException(String message) {//构造器
super(message);
}
}
复制代码
测试:
public class SelfDefinitionExceptionTest {
public static void main(String[] args) {
int i = 0;
if (i == 0){
try {
throw new SelfDefinitionException("该数不能等于0");
} catch (SelfDefinitionException e) {
e.printStackTrace();
}
}
}
}