引言:
所谓异常处理,好搜给的答案是:异常处理功能提供了处理程序运行时出现的任何意外或异常情况的方法。异常处理分离了接受和处理错误代码。而本人的理解就是:处理程序在运行过程中可能出现的一些错误的一个机制。
比如:我们在刚刚开始接触程序的时候,用到的if...else...语句其实在某种程度上也是一种错误处理机制,只不过这种错误我们可能提前知道了,所以产生了else来处理另一种情况,防止程序发生错误!但是这种处理是相当麻烦的,因为可能你每个地方都要做这样相同的处理,就会增加好多的重复无用代码!那么怎么解决呢?
在Java语言中就有异常处理机制来解决这一类问题,让我们一起来探究吧!
JAVA中的异常处理:
学习了JAVA的异常处理以后感觉真是非常方便的一种错误处理。Java语言提出的异常处理的方法,可以将所有的异常都用一个类型来表示,不同类型的异常又可以对应不同的子类异常。
在Java中,所有的异常都有一个共同的父类:Throwable。Java异常可以分为可处理的异常(Exception)以及不可处理的异常(Error)。他们的结构如下图:
由图中我们可以看出:可处理的异常又分为两大类:运行时遗产隔阂非运行时异常!
运行时异常(RuntimeException)属于不检查异常,程序可以选择捕获处理,也可以不处理它。运行时异常是那些可能再Java虚拟机正常运行期间抛出的异常,Java编译器一般不会去检查它。也就是你就算在程序中用try....catch捕获了它,也没有抛出它,扔回通过编译。这种异常可以通过改进代码实现来避免
非运行时异常就是我们必须处理的异常,如果不用try...catch捕获并处理它,是不能通过编译的!
Java异常处理5大关键字:
Java异常处理通过try、catch、throw、throws、finally进行管理。
一、
try代码段包含可能产生例外的代码,后面跟着一个或者多个catch代码段。每个catch代码段声明其能处理的一种特定类型的异常并提供处理的方法。当异常发生时,程序会终止当前的流程,根据获取异常的类型去执行相应的catch代码段。
finally段的代码无论是否发生异常都会执行!主要进行资源清除工作,关闭打开的文件,删除临时文件。
基本格式为:
try{
//可能抛出异常的语句
}catch(SomeException1 e)
{
.........
}catch(SomeException2 e)
{
.........
}finally{
.......
}
二、
当发生的异常程序处理不了,那么就需要将异常抛出。Java程序的抛出异常有两个关键字:throws和throw。
1、throws抛出异常:
throws语句用于定义某个方法时声明该方法要抛出的异常类型。throws经常将异常抛给使用该方法的方法,如果这个方法仍处理不了问题,则继续向上抛出,最终要有一个可以处理该异常的调用者(方法)。
注意:对于不检查异常,可以不用throws关键字,但是运行时异常会被系统抛出;对于一个可能出现异常的方法,要么用try-catch捕获,要么用throws子句声明将它抛出;如果一个方法不能处理该异常,那么应该继续抛出,直到处理掉这个异常。
例如:
readFile() throws IOException{.....}
method1() throws IOException{
readFile()
}
method2() throws IOException{
method1()
}
public static main(String s){
try{
method2()
}catch(IOException e){.......}
}
2、throw抛出异常
throw总是出现在方法体中,用于抛出Throwable类型异常。它只能抛出Throwable类或其子类的实例对象,不能抛出别的。并且程序会在throw语句后立即终止,它后面的语句执行不到。我们可以创建异常类的实例对象用throw抛出。
例如:
throw new IOException
3、throw和throws的区别:
首先要明确的是:抛出的异常是一定要处理的,不然就会出错!throw是把异常抛出来,这个异常可以使系统定义的,也可以使自己定义的,但是必须得是throwable类型的;而throws是把本方法产生的异常向上抛出,直到找到可以处理这个异常的方法为止,它可以抛出多个异常!
Java自定义异常:
使用上面JAVA内置的异常类一般可以处理大部分的异常情况。有一些极少数的时候我们需要自定义异常。自定义的异常类,通常只需要继承Exception类就可以了!
声明自定义异常类:
继承java.lang.Exception类来声明自己的异常类。
这里需要注意的一点是:如果要重写父类的抛出异常的方法,那么需要抛出和原方法抛出异常类型一样的异常或者干脆重写的方法不抛出异常!
使用自定义异常:
1、在方法里面用throw抛出异常
2、如果需要在当前方法中抛出异常并处理,可以用try....catch语句处理抛出的异常;还可以用throws声明可能抛出异常,通过调用此方法的调用者处理此异常。
第一种:
根据条件抛出某种异常:
public void test() throws SomeException{
...
if(....){ //条件
throw new SomeException();
}
}
第二种:
将异常转型,方便阅读理解
public void test() throws SomeException{
....
try{
....
}catch(MyException e){
...
throw new SomeException();
}
}
综合应用:
//声明自定义异常类
class MyException extends Exception{
private int id;
public MyException(String message,int id){
super(message);//调用父类的构造方法
this.id=id;
}
public int getId(){
return id;
}
}
//使用自定义异常类
public class Test{
public void regist(int num)throws MyException{
if(num<0){
throw new MyException("人数为负值,不合理",3);
}
System.out.println("登记人数"+num);
}
public void manager(){
try{regist (100);}//调用registe方法
catch(MyException e){ //如果存在异常,则处理!
System.out.println("登记失败,出错类型码=" + e.getId());
}
System.out.print("操作结束");
}
public static void main(String[] args){
Test t=new Test();
t.manager();
}
}
小结:
在师姐验收机房合作版的时候就说过异常处理这个词,感觉当时的系统太小,不用异常处理,完全可以用if ....else....语句就可以处理了!但是在Java学习这里了解到原来还有不检查异常和必须处理的异常之分,还可以自己写异常类!非常方便,所以要好好的总结一下,向Java专业化编码迈进!加油!