Java异常处理概述

    |     2015年4月18日   |   Java异常处理   |     0 条评论   |    1605

程序里的错误可分三类:编译错误、逻辑错误和运行时错误。异常处理的目标是:即便运行中出错,也尽量让程序正常结束,而不是中途停死。

类型 表现 何时处理
编译错误 没遵守语法,编不过 编译阶段必须排除
逻辑错误 能编译能跑,结果不对 测出来再改业务
运行时错误 出现不可能执行的操作 用异常机制接住

异常是执行期间的各种意外:用户输入出错、文件找不到、磁盘或内存不够、溢出 / 除零、数组下标越界等。逻辑错误有时也会引发运行时错误。

一、运行时常见三类异常

  1. JVM 内部 Error:不在用户程序控制之内,一般不用处理。
  2. 系统预定义的标准异常:除零、下标越界、访问空对象等,需要用户程序处理。
  3. 按需要自定义的异常类。

下面这段会数组越界:长度为 2 的数组,循环却写到下标 2。

class TestSystemException {
    public static void main(String[] args) {
        int num[] = new int[2];
        for (int i = 1; i < 3; i++) {
            num[i] = i;
            System.out.println("num[" + i + "]=" + i);
        }
    }
}

二、抛出与捕捉

处理异常就两件事:抛出(throw)和捕捉(catch)。运行出错且能对应到某个预定义异常类时,系统自动 new 一个该异常对象,这叫抛出。程序里若找到处理代码,就把对象交给它,这叫捕捉。找不到则交给运行时默认处理:先打印描述字符串,再终止程序。

抛出有两种:系统自动抛出;人为抛出。人为又分:方法头用 throws 声明,或方法体内 throw 一个异常对象。

class Throws_Exp {
    public static void main(String[] args)
            throws ArithmeticException, ArrayIndexOutOfBoundsException {
        int a = 4, b = 0, c[] = {1, 2, 3, 4, 5};
        System.out.println(a / b);
        System.out.println(c[a + 1]);
        System.out.println("end");
    }
}

class Throw_Exp3 {
    public static void main(String[] args) {
        int a = 5, b = 0, c[] = {1, 2, 3, 4, 5};
        System.out.println("Before throw");
        if (b == 0)
            throw new ArithmeticException();
        System.out.println(a / b);
        if (a > 4)
            throw new ArrayIndexOutOfBoundsException();
        System.out.println(a / b);
    }
}

捕捉用 try-catch,可选 finally(无论是否发生异常都执行):

try {
    // 可能发生异常
} catch (异常类1 e1) {
    // 处理异常1
} catch (异常类n en) {
    // 处理异常n
} finally {
    // 不论异常是否发生都要执行
}

三、自定义异常类

自定义异常必须是 Throwable 或 Exception 的子类。一般声明两个构造方法:无参,以及以字符串为参数(字符串应反映异常信息)。自定义异常同样要用 try-catch 捕获,但必须由用户自己 throw new MyException()。

class Exception_exp {
    public static void main(String[] args) {
        try {
            System.out.println("2+3=" + add(2, 3));
            System.out.println("-8+10=" + add(-8, 10));
        } catch (Exception e) {
            System.out.println("Exception is " + e);
        }
    }
    public static int add(int n, int m) throws UserException {
        if (n < 0 || m < 0) throw new UserException();
        return n + m;
    }
}
class UserException extends Exception {
    UserException() {
        super("数据为负数");
    }
}

一句话总结:编译错误先改语法,逻辑错误改业务;运行时意外用 throw/throws 抛、try-catch-finally 接,需要领域语义就自己继承 Exception 再 throw。

转载请注明来源:Java异常处理概述
本文链接地址:https://ai.zhousir.top/?p=289
回复 取消