Java异常

异常框架

Java异常架构图

Throwable接口

Throwable是Java语言中所有错误或异常的超类。Throwable包含两个子类:Error和Exception。

Error

指合理的应用程序不应该试图捕获的严重问题,程序自身无法修复这些错误。编译器不会检查此类异常

Exception

与Error对应,指的是合理的应用程序要捕捉的异常条件。分为被检查的异常(Checked Exception)和运行时异常(Runtime Exception)。

Checked Exception

Exception类本身,以及Exception的子类中除了运行时异常之外的其它子类都属于被检查异常。Java编译器会对此异常进行检查。此类异常,必须通过throws声明抛出异常或通过try-catch对异常进行捕获处理,才可以通过编译。被检查异常通常可以恢复

Runtime Exception

RuntimeException及其子类都被称为运行时异常。当程序中可能出现这类异常时,即使没有通过throws声明抛出,也没有用try-catch语句进行捕捉,还是会编译通过,也就是说,Java编译器不会检查此类异常。但是此类异常还是可以通过throws声明或try-catch语句进行抛出。如果产生运行时异常,则需要通过修改代码来进行避免。

关键字

Java异常是Java提供的一种识别及响应错误的一致性机制。异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。

  • try:try语句块中放入可能抛出异常的语句。
  • catch:catch语句块用来捕获try语句块中抛出的异常。
  • finally:finally语句块中的代码总会被执行,主要用于回收在try块里打开的物力资源(数据库连接,网络连接或磁盘文件等)。
  • throw:用于抛出异常。
  • throws:用于声明抛出的异常。

例1 try、catch和finally

public class exceptionTest {
    public static void main(String[] args) {
        System.out.println(func());
    }

    public static int func() {
        // try语句块发生异常之后,异常语句后的剩余内容就不会再被执行了
        try {
            int i = 10 / 0;
            System.out.println("剩余内容");

            // 捕捉抛出的异常
        } catch (Exception e) {
            System.out.println("catch");
            System.out.println(e.getMessage());
            System.out.println(e.toString());
            System.out.println();
            return 0;

            // finally语句块总是会被执行。
            // 如果有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,
            // 如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
        } finally {
            System.out.println("finally");
            return 2;
        }
    }
}

以下是执行结果:

catch
/ by zero
java.lang.ArithmeticException: / by zero

finally
2

可以看出,try快中抛出异常后,异常语句后的内容不再执行;接下来到执行catch块,当catch块中有return语句而且又有finally块时,先执行finally块中的语句;执行finally块中的语句时,其中有return语句,执行完return语句后就不再回到catch语句,而是整个方法执行完毕。

如果把finally块中的return语句注释掉,再次执行,效果就是finally块中的语句先执行,再回到catch块中执行return语句。

catch
/ by zero
java.lang.ArithmeticException: / by zero

finally
0

例2 throw和throws

public class exceptionTest1 {
    public static void main(String[] args) {
        try {
            test();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }

    // test()的try语句块中产生ArithmeticException异常(除数为0),并在catch中捕获该异常;
    public static void test() throws MyException {
        try {
            int i = 20 / 0;
        } catch (ArithmeticException e) {
            // 接着抛出MyException异常。main()方法对test()中抛出的MyException进行捕获处理。
            throw new MyException("This is MyException");
        }
    }
}

/**
 * MyException是继承于Exception的子类。
 */
class MyException extends Exception {
    MyException(String msg) {
        super(msg);
    }
}

以下是执行结果:

com.exceptionTest0.MyException: This is MyException
	at com.exceptionTest0.exceptionTest1.test(exceptionTest1.java:18)
	at com.exceptionTest0.exceptionTest1.main(exceptionTest1.java:6)

可以看到,throws关键字用在方法声明时表示会抛出何类错误;throw关键字则是直接抛出某种错误。

posted @ 2020-03-25 13:15  LeoSyn  阅读(399)  评论(0)    收藏  举报