> *异常通俗讲就是程序在运行时出现不正常情况,对应着生活中一个具体的事物,能够通过java类的形式进行描述,并封装对象,即java对不正常情况进行描述后的对象体现。*
* 严重的问题,java通过Exception类进行描述,对Exception可以采用针对性处理方式
* 不严重的问题,java通过Error类进行描述,对Error一般不便携针对性代码对其进行处理
### 异常的简单处理
> java 提供特有的语句对捕获的异常对象进行处理,如 getMessage()
```java
try //① 当异常发生时,会跳转至②
{
// 需要被检测的代码
}
catch()// ②
{
// 处理异常的代码,即处理方式
}
finally // ③
{
// 一定会执行的语句;
}
```
#### 举例1:
```java
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窗口而用户是否能够调出命令行窗口查看都不得知;所以这种处理方式不好,而通常会以异常日志的形式保存至本地或上传至服务器。
`这里采用简单处理方式以方便学习和理解`
```java
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!!!
*/
```