1.异常的概述
异常就是程序出现了不正常的情况
异常的体系结构:在 Java 中所有异常类型都是内置类 java.lang.Throwable 类的子类,即 Throwable 位于异常类层次结构的顶层。Throwable 类下有两个异常分支 Exception 和 Error,Exception 类用于用户程序可能出现的异常情况,它也是用来创建自定义异常类型类的类。Error 类型的异常通常是灾难性的致命错误,不是程序可以控制的。如图 1 所示。
其中异常类 Exception 又分为运行时异常和编译时异常,除运行时异常其他都被称为非运行时异常,也称为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。
Exception 类型的异常包括(及其区别):
- 运行时异常都是 RuntimeException 类及其子类异常,如 NullPointerException、IndexOutOfBoundsException 等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般由程序逻辑错误引起,程序应该从逻辑角度尽可能避免这类异常的发生。
- 编译时异常是指 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如 IOException、ClassNotFoundException 等以及用户自定义的 Exception 异常(一般情况下不自定义检查异常)。
2.异常的处理方式
- try-catch
- throws
(1)try-catch
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常处理代码;
}
catch里的语句执行完后,程序还可以继续往下执行
public class Throwable {
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]); //ArrayIndexOutOfBoundsException
}catch (ArrayIndexOutOfBoundsException e){
// System.out.println("您输入的索引不存在");
e.printStackTrace();
// System.out.println(e.getMessage());
//System.out.println(e.toString());
}
}
}
try {//try监控区域
System.out.println(a/b);
}catch (Error e) {// catch(想要捕获的异常类型) 捕获异常 System.out.println("Error");
}finally {//一般是处理善后工作
System.out.println("finally");
}
(2)throws
public void 方法() throws 异常类名{
}
public void checkScore(int score) throws ScoreException {
if(score < 0 || score >100){
throw new ScoreException("你给的分数有误,分数应该在0-100之间");
}else{
System.out.println("分数正常");
}
}
throw和throws的区别:
- throw:用在方法体内,跟的是异常对象名;由方法体内的语句处理;执行了throw一定抛出了某种异常
- throws:用在方法声明后面,跟的是异常类名;由该方法的调用者来处理;表示出现异常的一种可能性,并不一定会发生这些异常
3.自定义异常
使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需要继承Exception类即可。
大体可分为以下几个步骤:
- 创建自定义异常类。
- 在方法中通过throw关键字抛出异常对象。
- 如果在当前抛出异常的方法中处理异常,可以使用try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,继续进行下一步操作。
- 在出现异常方法的调用者中捕获并处理异常。
public class Teacher {
public void checkScore(int score) throws ScoreException {
if(score < 0 || score >100){
throw new ScoreException("你给的分数有误,分数应该在0-100之间");
}else{
System.out.println("分数正常");
}
}
}
import java.util.Scanner;
public class ScoreDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入分数:");
int s = sc.nextInt();
Teacher t = new Teacher();
try {
t.checkScore(s);
} catch (ScoreException e) {
e.printStackTrace();
}
}
}