异常
1. 概述
- 异常就是程序出现了不正常的情况
2. 体系结构
3. JVM默认处理异常的方式
- 把异常的名称,错误原因及异常出现的位置等信息输出在了控制台
- 程序停止执行
4. try-catch方式处理异常
① 定义格式
try {
可能出现异常的代码;
} catch(异常类名 变量名) {
异常的处理代码;
}
② 执行流程
- 程序从 try 里面的代码开始执行
- 如果出现异常,就会跳转到对应的 catch 里面去执行
- 执行完毕之后,程序还可以继续往下执行
③ 示例
public class ExceptionDemo01 {
public static void main(String[] args) {
System.out.println("开始"); // 输出开始
method();// 方法中存在异常, 但并不会终止程序
System.out.println("结束"); // 输出结束
}
public static void method() {
try {
int[] arr = {1, 2, 3};
System.out.println(arr[3]); // 索引越界异常,程序跳转到catch中
System.out.println("这里能够访问到吗");// 该条代码不会执行
} catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace(); // 输出异常信息
}
}
}
5. throws方式处理异常
① 定义格式
public void 方法() throws 异常类名 {
}
② 示例
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("开始");
// method();
try {
method2();
}catch (ParseException e) {
e.printStackTrace();
}
System.out.println("结束");
}
//编译时异常
public static void method2() throws ParseException {
String s = "2048-08-09";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
//运行时异常
public static void method() throws ArrayIndexOutOfBoundsException {
int[] arr = {1, 2, 3};
System.out.println(arr[3]);
}
}
6. 编译时异常和运行时异常的区别
① 编译时异常
- 都是Exception类及其子类
- 必须显示处理,否则程序就会发生错误,无法通过编译
② 运行时异常
- 都是RuntimeException类及其子类
- 无需显示处理,也可以和编译时异常一样处理
7. 自定义异常
// 自定义异常类
class ScoreException extends Exception {
public ScoreException() {}
public ScoreException(String message) {
super(message);
}
}
// 老师类
class Teacher {
public void checkScore(int score) throws ScoreException {
if(score<0 || score>100) {
// throw new ScoreException();
throw new ScoreException("你给的分数有误,分数应该在0-100之间");
} else {
System.out.println("成绩正常");
}
}
}
// 测试类
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入分数:");
int score = sc.nextInt();
Teacher t = new Teacher();
try {
t.checkScore(score);
} catch (ScoreException e) {
e.printStackTrace();
}
}
}