以前我们对代码的认识也许就是能跑起来就挺好的.至少我以前就是这样,但是我们的程序难免会在运行的过程中出现这样或那样的错误,有些问题我们在写代码的过程中没有注意到,或者我们没有办法避免这样的问题,要是使用这样的方法就可能会存在某一类错误.
这时我们该怎么办?
让程序停止运行?
异常处理就给我们提供了一种很好的解决方案.
### 何为异常?
Java异常是java提供的用于处理程序在运行过程中发生的一些异常事件的一种机制.好的程序应该在异常发生是提供处理这些错误的方法,使得程序不会因为异常的发生而产生不可预见的结果. ,当程序发生异常时,java给我们提供了一种处理这种异常的方法.让我们的程序能够更好的处理异常.
### 异常分类
![](https://box.kancloud.cn/2016-03-23_56f1fee469e40.jpg)
从图中我们可以看到Throwable类是所有异常类的超类,该类的两个直接子类是Error和Exception,其中Error表示这是系统错误是无法处理的,而Exception是可以处理的错误。其中在Exception下的一个子类RuntimeException表示这类错误时经常出现的错误,对这样的错误可以处理也可以不处理。
此外异常还可以分为运行时异常和非运行时异常,运行时异常是RuntimeException异常,而其他的异常则为非运行时异常。
![](https://box.kancloud.cn/2016-03-23_56f1fee47f8f2.jpg)
![](https://box.kancloud.cn/2016-03-23_56f1fee497c8d.jpg)
### 异常的处理
对于异常的处理,我们会用到try…….catch……finally,三个语句块
其中try语句块下的代码时需要执行的代码,这段代码可能会出现异常。我们也可以理解为我要尝试去执行语句块中的代码。
Catch语句块是当try语句块中尝试执行的代码发生异常后,catch就是让我们去捕捉这个异常。捕捉到后就可以对异常进行处理。Catch 语句块可以有很多,每个catch都会步骤一个类型的异常。如果在尝试执行的语句块中可能会发生文件不存在和溢出两个异常这时就要用catch去捕捉,只写其中一个,另一个是不能被捕捉到的。
![](https://box.kancloud.cn/2016-03-23_56f1fee4bb21e.jpg)
Finally语句块是不管发不发生异常都要执行的。Finally该语句块通常用于放置程序中必须执行的代码,如关闭数据库的连接关闭IO流。
需要注意的是当try语句块中发生了异常后,会从发生异常的代码跳到catch语句块,也就是说发生了异常的哪一行代码之后的代码时不执行的。
### 异常的抛出(throw 和throws)
当我们的程序发生可能会发生异常的时候,我们可以进行的操作包括自己手动去处理异常或者将异常交给方法的调用者去处理。这时手动处理就使用的throw,如果要将异常交给调用者去处理就需要在方法声明行里使用throws来告诉方法的调用者,我的代码可能要出这样的异常,你要处理。
Throw 通常在方法体里,去抛出异常,而throws通常在方法声明中,之处可能会抛出的异常
一段示例代码
~~~
public class throwTest {
int[] number={100,80,50,12,16};//创建并初始化具有6个元素的数组
public void setNum(int index,int value)//赋值
{
number[index]=value;
}
public int GetNum(int index)//取值
{
return number[index];
}
public static void main(String[] args){
try{
throwTest tt=new throwTest();
int value=tt.GetNum(7);
System.out.print(value);
}
catch(ArrayIndexOutOfBoundsException ex){
System.out.print("下标越界");
}
finally
{
System.out.println("\n不管发生不发生异常这行代码都要执行!");
}
}
}
~~~
这段代码展示了一个简单的捕获异常并处理的代码。这这段代码中出现了下标越界。
看这样一个错误
![](https://box.kancloud.cn/2016-03-23_56f1fee4da49b.jpg)
在方法体中我抛出了一个错误,我并没有对这个错误进行处理。系统就对我说我必须对其进行捕获或声明以便抛出。所以当错误出现时我们的处理方式就可以有以下两种,捕获或者抛出。
### 自定义异常类
对于异常我们也可以自定义,创建自定义的异常类需要继承自Exception类,并提供一个含有String类型的参数。该参数就是异常描述的信息。
下面是一段代码示例
首先定义一个异常类
~~~
public class NewException extends Exception{
//定义一个构造方法
public NewException(String msg)
{
super(msg);//调用含有参数的构造方法
}
}
~~~
然后是程序代码。在代码中如输入的数字大于100则抛出自定义的异常。
~~~
import count3quit.NewException;
public class throwTest {
int[] number={100,80,50,12,16};//创建并初始化具有6个元素的数组
public void setNum(int index,int value) throws NewException//赋值
{
if(value>=100)
{
throw new NewException("捕获异常成功");
}
number[index]=value;
}
public static void main(String[] args){
try{
throwTest tt=new throwTest();
tt.setNum(1, 200);
}
catch(NewException ex)
{
System.out.print(ex.getMessage());
}
}
}
~~~
### 总结
在异常处理之前我们总是使用if语句去处理在程序中发生的一些错误但是这无疑是很费力的,此外if语句的使用让代码的可读性降低。更重要的是对于一些无法预料的异常时刻威胁的应用程序,毫无疑问,异常处理让应用程序更加的安全