几乎所有的代码里面都会出现异常,为了保证程序在出现异常之后可以正常执行完毕,就需要进行异常处理。

先来看一下异常的继承类结构

java注解异常捕获 java的异常捕获结构_捕获

所有的异常都是由Throwable继承而来,我们来看他下面的两个子类Error和Exception.
Error类描述了Java运行时内部错误和资源耗尽错误。应用程序不抛出此类异常,这种内部错误一旦出现,除了告知用户并使程序安全终止之外,再无能无力。这种情况很少出现。
我们需要关心的是Exception以及其子类。在Exception之下又分为两个分支,RuntimeException和IOException。
由于程序错误导致的异常属于RuntimeException;而如果程序本身没有问题,但由于像I/O错误这类问题导致的异常属于IOException。
Java语言规范将派生于Error类或RuntimeException类的所有异常称为非受查异常;所有的其他异常称为受查异常

异常的影响

异常是导致程序中断执行的一种指令流。程序之中如果出现异常并且没有合理处理的话就会导致程序终止执行。

范例:观察正确程序流

java注解异常捕获 java的异常捕获结构_异常处理_02


此时没有任何异常产生,程序可以正常执行完毕。范例:产生异常

java注解异常捕获 java的异常捕获结构_java_03


数学计算开始前 Exception in thread"main"java.lang.ArithmeticException: / by zero at test.Test.main(Test.java:6)

现在程序之中产生了异常,但是在异常语句产生之前的语句可以正常执行完毕,而异常产生之后程序直接进行了结束。为了保证程序出现异常后还可以继续向下执行,就需要异常处理。

异常处理格式

异常处理的语法格式如下:

java注解异常捕获 java的异常捕获结构_异常_04


对于以上三个关键字,可以出现的组合: try…catch 、 try…finally 、 try…catch…finally

范例:对异常进行处理

java注解异常捕获 java的异常捕获结构_java注解异常捕获_05

出现了异常之后,由于存在异常处理机制,依然可以正常执行完毕。

以上代码虽然进行了异常处理,但是存在一个问题:你现在根本不知道程序产生了什么样的异常。所以为了明确的
取得异常信息,可以直接输出异常类对象,或者调用所有异常类中提供的printStackTrace()方法进行完整异常信息的输出。

范例:取得异常的完整信息

java注解异常捕获 java的异常捕获结构_java注解异常捕获_06

在进行异常处理的时候还可以使用 try…catch…finally 进行处理。

范例:使用 try…catch…finally 进行处理

java注解异常捕获 java的异常捕获结构_异常处理_07

不管此时是否产生异常,最终都要执行finally程序代码,所以finally会作为程序统一出口。
以上程序是直接固定好了两个数字进行除法运算,现在通过初始化参数来进行除法运算

范例:初始化参数进行数学运算

public class Test {
    public static void main(String[] args) {
        System.out.println("[1].数学计算开始前");
    try {
          int x = Integer.parseInt(args[0]) ;
          int y = Integer.parseInt(args[1]) ;
          System.out.println("[2].进行数学计算:"+x/y);
   } catch (ArithmeticException e) {
           e.printStackTrace();
   }finally {
           System.out.println("[Finally]不管是否产生异常,都执行此语句");
     }
           System.out.println("[3].数学计算结束后");
    }
}

此时会存在如下问题:

  • 用户没有输入初始化参数:ArrayIndexOutOfBoundsException
  • 用户输入的不是数字:NumberFormatException
  • 被除数为0:ArithmeticExceptio

以上代码我们发现,通过catch捕获异常的时候如果没有捕获指定异常,程序依然无法进行处理,现在最直白的解
决方法就使用多个catch。

java注解异常捕获 java的异常捕获结构_捕获_08