文章目录
- 异常
- 编译、运行时异常
- Throwable
- 成员方法
- getMessage
- toString
- printStackTrace
- 异常处理
- JVM 默认处理
- 捕获异常 try... catch...
- throws 抛出异常
- 自定义异常
异常
每次遇到异常都到 JDK帮助文档 去查看,有助于对异常的熟练
概述: 程序出现了不正常的情况
编译、运行时异常
一个写的时候红色波浪线,一个运行时报错
分类 | 编译时异常 / 受检异常 | 运行时异常 / 非受检异常 |
异常类 | Exception类 及其子类 | 其他类 |
异常处理 | 必须显示处理 否则程序就会发生错误,无法通过编译 | 无需显示处理 也可以和编译时异常一样处理 |
异常处理 ↓ ↓ |
Throwable
概述:
所有异常的父类
THrowable 异常就算捕获了也解决不了
例如:无限递归调用
public static void tast() {
tast(); // 报错,栈溢出
}
成员方法
getMessage 和 toString 要放在 System.out.println(); 里,printStackTrace不需要
getMessage
异常的原因
System. out.println(e.getMessage());
// Index 3 out of bounds for length 3
toString
异常的 原因 和 异常类名
System.out.println(e.toString());
// java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
printStackTrace
异常的 原因 和 异常类名、异常信息
不用放在 System.out.println(); 里
e.printStackTrace();
// java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
// 异常信息
异常处理
JVM 默认处理
如果程序出现了问题,没有做任何处理,最终 JVM虚拟机 会做默认的处理 ↓
- 把异常的名称,异常原因及异常出现的位置等信息输出在了控制台
- 程序停止执行
system.out.println("开始");
int[]arr = {1,2,3};
System.out.printLn(arr[3]);
System.out.println("结束");
// 开始
// 报出异常,结束
捕获异常 try… catch…
格式:
try {
可能出现异常的代码;
} catch (异常类名 变量名) {
异常的处理代码;
} catch (异常类名 变量名) {
异常的处理代码;
...
} finally {
最终块,无论是否有异常都会执行的代码;
}
执行流程:
- 程序从 try 里面的代码开始执行
- 没有出现异常,跳过catch 再执行finally
- 出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统
- 当Java运行时系统接收到异常对象时,会到 catch 中去找匹配的异常类,找到后进行异常的处理
- 执行完毕之后,进入finally
注意:
输出 999
除非return换成
System.exit(1);
案例:
如果异常没有被捕捉住,那只会输出 “开始” “finally块”
System.out.println("开始");
try {
int[]arr = {1,2,3};
System.out.println(arr[3]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.printLn("你访问的数组的索引不存在");
abnormal.printStackTrace();
} finally {
System.out.println("finally块");
}
System.out.println("结束");
/*
开始
你访问的数组的索引不存在
java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
finally块
结束
(异常信息)
*/
throws 抛出异常
不是所有的情况都有权限通过 try…catch… 对异常进行处理,这种情况就要用 throws
如果采用throws这种方案,将来谁调用这个方法谁处理
因为 throws 的本质是 抛出异常,最终还是要用 try…catch… 来处理异常的
格式:
方法名() throws 异常类名 {
}
案例:
public static void main(String[] arge) {
System.out.println("开始");
try {
method();
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("结束");
}
// 编译时异常
public static void method() throws ParseException {
String s = "2022-02-12";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
/*
开始
Sat Feb 12 00:00:00 CST 2022
结束
*/
自定义异常
比如想要让大于100的成绩报异常,只需要定义一个 Exception 的子类就行
格式:
public class 异常类名 extends Exception {
无参构造
带参构造
}
范例:
public class scoreException extends Exception {
public scoreException () {}
public scoreException (string message){
super (message) ;
}
}
后续
后续内容在《Java SE基础学习笔记5·集合》