Java 异常处理

当程序出现错误,程序可以安全退出。

1. 异常的概念

Java采用面向对象的方式来处理异常,处理过程(每个异常都是一个对象):

  1. 抛出异常:在执行一个方法时,如果遇到异常,则这个方法生成代表该异常的一个对象,停止当前执行,将异常对象抛出给JRE
  2. 捕获异常:JRE得到该异常后,寻找相关的代码处理异常,JRE在方法的调用栈中,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。

2. 异常的分类

所有异常的根类:java.lang.Throwable (类)
Throwable:
a、Error类:JVM已经处于不可恢复的崩溃状态,遇到重启虚拟机
b、Exception类:程序员处理,分为:
1. Checked Exception:编译器处理
2. Runtime Exception:运行时候抛出(Unchecked Exception)

3. RuntimeException

需要程序员检查和处理,使用逻辑处理来避免此类异常
NullPointerException: 对象为空,调用了其属性和方法
ClassCastException: 强制转型错误
ArrayIndexOutOfBoundsException:
NumberFormatException: 使用包装类将字符串转为基本类型的数据类型时
……

4. CheckedException 已检查异常

编译器报错
两种方式:try/catch 和 throw
4.1 捕获异常:

try { 
    //语句1 , 如果遇到异常,创建异常对象,进行抛出,语句2不执行了,找到对应的catch,最后执行finally
    //语句2
} catch (Exception1 e) {
    //TODO
} catch (Exception2 e) {
    // TODO 
} finally {
    // 不管有没有异常,finally都要最后执行
    // finally只能有一条
    // finally语句块只有一种情况不回执行,即执行finally之前遇到了System.exit(0)结束程序运行。
}
//使用try/catch捕获异常
FileReader reader = null;
try {
    reader = new FileReader("/a.txt");
    char c1 = (char) reader.read();
    System.out.println(c1);
} catch (FileNotFoundException e) { // FileNotFoundException 是 IOException,写catch时候,子类写在父类前面,否则全部会被父类捕获
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
} finally {
    // 无论有无异常,都需要关闭reader
    try {
        if (reader != null) {
            reader.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

4.2 throws
将异常抛出给调用者处理

public static void main(String[] args) throws IOException { // main 方法抛给JRE
    readMyFile();
}
public static void readMyFile() throws IOException { // 将异常抛给调用者, 层层抛出
    FileReader reader = null;
    try {
        reader = new FileReader("/a.txt");
        char c1 = (char) reader.read();
        System.out.println(c1);
    } catch (FileNotFoundException e) { // FileNotFoundException 是 IOException,写catch时候,子类写在父类前面,否则全部会被父类捕获
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 无论有无异常,都需要关闭reader
        try {
            if (reader != null) {
                reader.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5. 自定义异常

继承CheckedException/RuntimeException

class Person {
    private int age;
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        if (age < 0) {
            throw new IllegalAgeException("年龄不能为负数")
        }
    }
    
}
class IlegalAgeException extend RuntimeException {
    public IlegalAgeException() {
    }
    public IlegalAgeException(String msg) {
        super(msg);
    }
}

TIPs:

不要小粒度的使用异常,统一功能块放在一起,一般抛给调用者处理,有高层处理。

转载于:https://www.cnblogs.com/isguoqiang/p/11487853.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值