异常分类
-
运行时异常(RuntimeException或者其子类)
-
编译时异常(不是RuntimeException或者其子类)
运行时异常
- 数组索引越界异常
- 空指针异常
- 数学操作异常
- 类型转换异常
- 数据转换异常
补:运行时异常一般是由程序员没有考虑好或者编程逻辑不严谨引起的程序错误
编译时异常处理方式
- 出现异常直接抛出给调用者,调用者也继续向上抛出(可能会引起程序死亡,不建议使用)
- 使用throws继续向上抛出给调用者
- 如果异常最终抛出给虚拟机将引起程序死亡
- 出现异常自己捕获(可以使用)
- 使用try…,catch…
- 监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获
- 发现异常自己独立完成异常处理,程序继续向下执行
- 出现异常直接抛给调用者,调用者捕获处理(推荐)
- 方法直接将异常通过throws抛出给调用者
- 调用者收到异常后直接捕获处理
第三种处理方式例子
public static void main(String[] args) {
try {
String time = "2022-07-14 08:10:32";
Time(time);
System.out.println("程序成功执行");
} catch (ParseException e) {
e.printStackTrace();
System.out.println("程序执行失败");
}
}
public static void Time(String time) throws ParseException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(time);
System.out.println(date);
}
运行时异常处理
- 建议只需要在最外层捕获即可
例子
public static void main(String[] args) {
try {
sub(5,0);
} catch (Exception e) {
System.out.println("计算错误");
e.printStackTrace();
}
System.out.println("结束");
}
public static void sub(int a,int b){
System.out.println(a/b);
}
自定义异常
- 自定义创建一个异常类
public class MyException extends Exception{
public MyException() {
}
public MyException(String message) {
super(message);
}
}
- 使用自定义异常去捕获异常信息
try {
sub(5,0);
} catch (MyException e) {
System.out.println("计算错误");
e.printStackTrace();
}
public static void sub(int a,int b) throws MyException {
if(b==0) {
throw new MyException("除数不能为0");
}else {
System.out.println(a / b);
}
}