异常通俗讲就是程序在运行时出现不正常情况,对应着生活中一个具体的事物,能够通过java类的形式进行描述,并封装对象,即java对不正常情况进行描述后的对象体现。

  • 严重的问题,java通过Exception类进行描述,对Exception可以采用针对性处理方式
  • 不严重的问题,java通过Error类进行描述,对Error一般不便携针对性代码对其进行处理

异常的简单处理

java 提供特有的语句对捕获的异常对象进行处理,如 getMessage()

try //① 当异常发生时,会跳转至②
{
    // 需要被检测的代码
}

catch()// ②
{
    // 处理异常的代码,即处理方式
}

finally // ③
{
    // 一定会执行的语句;
}

举例1:

class Demo
{
    int div(int a, int b)
    {
        return a/b;
    }
}
class ExceptionDemo1
{
    public static void main(String[] args)
    {
        Demo divdeom = new Demo();
        // 检测到异常
        try
        {
            int x = divdeom.div(1,0);// 异常在此处产生,相当于此处产生了某个Exception的对象,即 new ArithmeticException()
            System.out.println("x=" + x);
        }

        // 捕获异常,即有Exception e = new ArithmeticException();
        // 那么通过 e 就能够对异常进行处理
        catch(Exception e)
        {
            System.out.println("除数为零!");
            System.out.println(e.getMessage());// 打印: / div zero
            System.out.println(e.toString());// 打印:异常名称:异常信息

            e.printStackTrace();// 打印:异常名称:异常信息,异常出现的位置
            // 而 jvm 默认的异常处理机制,就是在调用printStackTrace()方法来打印异常的堆栈的跟踪信息
        }

        System.out.println("END!!!");
    }
}
/* 输出结果:
除数为零!
/ by zero
java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
        at Demo.div(ExceptionDemo1.java:5)
        at ExceptionDemo1.main(ExceptionDemo1.java:16)
END!!!
*/

举例2:

在函数上声明异常:提高安全性,让调用者处理,不处理则编译失败

(1) 声明异常时,应生命为具体的异常,使得处理可以更具体
(2)声明有几个异常就对应有几个catch块,不要定义多余的catch块。
如果多个catch块中的异常出现继承关系,父类异常catch块放在最下面

注意:catch中的处理方式一定要具体,不要简单的定义如 e.printStackTrace(),或者简单的输出语句。

因为这两种方式展现出来的方式,对用户而言不是恰当的:用户可能不懂这些异常信息是什么意思;打印语句出现在dos窗口而用户是否能够调出命令行窗口查看都不得知;所以这种处理方式不好,而通常会以异常日志的形式保存至本地或上传至服务器。

这里采用简单处理方式以方便学习和理解

class Demo
{
    // 在功能上通过throws关键字声明该功能有可能出现问题。可声明多个异常,当出现问题时,将抛出异常。
    int div(int a, int b)throws ArithmeticException,ArrayIndexOutOfBoundsException
    {
        int[] arr = new int[a];
        System.out.println(arr[3]);

        return a/b;
    }
}
class ExceptionDemo2
{
    public static void main(String[] args)
    {
        Demo divdeom = new Demo();
        try
        {
            int x = divdeom.div(4,0);// 此时,越界异常先发生,先被处理
            System.out.println("x=" + x);
        }

        // 捕获到异常并处理
        catch(ArithmeticException e)
        {
            System.out.println("除零!!!");
        }
        catch(ArrayIndexOutOfBoundsException e)
        {
            System.out.println("越界!!!");
        }
        System.out.println("END!!!");
    }
}
/*
调用 divdeom.div(4,0) 时的结果:
0
除零!!!
END!!!

调用 divdeom.div(4,1) 时的结果:
0
x=5
END!!!

调用 divdeom.div(2,0) 或 divdeom.div(2,1) 时的结果:
越界!!!
END!!!
*/