----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
由于环境的问题,一直以来都是在自学,以下是我对java中异常机制的一些理解.可能有些表达不当的地方.请原谅!
在java中,提倡一种思想:万物皆对象.而异常作为一种事物,自然也是难以逃脱这种思想的束缚,被描述成了一类对象(Throwable).
那么该类对象存在的意义是什么? 有什么特殊性呢?
它的意义就我的理解来说有2点
1.异常本身是对异常这类问题的描述,如果我们的程序中出现了异常,我们肯定要把它表示出来吧,也就是说把它抛出异常.
2.异常异常就是不正常嘛,既然都不正常了,我们肯定要去捕捉并处理它嘛.
先说异常的抛出,这涉及到两个关键字:throw throws
如果某个方法中出现了异常,我们就可以用throw关键字把这个异常对象抛出去.格式如:
throw 异常对象; //异常本身是一些类,所以在java中就可以用 new 异常类() 来创建一个具体的异常对象了.
例如要抛出一个IO异常:throw new IOException();更具体的可以在API文档中找到
既然一个方法出现了问题,我们肯定要在方法上面标识一下吧,总得告诉别人这个方法可能有问题吧!这就用到了另一个关键字:throws ,它的用法格式:
throws 异常类 //它由于是标识某个方法可能出问题,所以是放在某个方法后面的.例如,我有一个求和的方法,它内部如果算出来和是100,就有问题,可以如下定义
public int sum(int x,int y)throws Throwable
{
int sum = x+y;
if(sum==100)
throw new Throwable("有问题!");
return sum;
}
当然了,我这儿纯属乱来的,但是语法正确,不是吗?
好了,说完了抛出异常,现在说对异常的捕捉和处理.这涉及到以下几个关键字:try,catch,finally.
如果一个方法被声明了有可能抛出异常,那么我们在使用它的时候有两种方式,要么在我们要使用它的方法的上面再给它抛出异常,比如:就拿我上面那个方法来说事吧.
我现在要调用这方法,发现它是有可能出问题的,好吧!那么我用以调用它的方法也就可能会出问题了.
public void mothed()throws Throwable //好吧,我使用了它,那么自然的,我这也有可能会出现问题.
{
sum();//这哥们可能出问题.
}
另一种方式是,比如这哥们可能出现问题.那么我就测试下它,如果有问题,我就处理一下,先测试吧,这就有一个关键字try了,它的用法.
try {/*这里是可能出现异常的代码*/ }//它的作用就是测试这个代码块中的代码是否出现异常.
好吧!出现了异常肯定是要处理吧?这就是另一个关键字catch了.它通常于try连用.格式有:
try{/*要测试的代码*/}catch (异常类 对象名/*这里就是要捕捉的对象了*/){/*这里面是对捕捉到的异常进行的处理代码*/}
当然了,如果要测试的代码里面出现多个异常,我们就可以用多个catch语句与它们相对应.格式如
try{}catch(异常类1 对象名1){}catch(异常类2 对象名2){}....
在实际的开发中,如果我们使用了某些资源,还没来得及关闭就出现了异常,那么怎么办呢?如果是可以被捕捉和处理的异常还好,而有的异常一出现,会直接中止程序,
而这些资源还没有得到释放,这样就相当麻烦了,那帮编写java语言的哥们自然考虑到了这一点,他们给的解决方案就是finally关键字.它也是通常与try联用.格式有:
格式1: try{}catch(异常类1 对象名1){}...catch(异常类n 对象名n){} finally{/*在该代码块中的代码一定会被执行,当然如果jvm都退出了这个自然就就是扯蛋了*/}
格式2: try{}catch(异常类 对象名){}finally{/*在该代码块中的代码一定会被执行,当然如果jvm都退出了这个自然就就是扯蛋了*/}
格式3:try{}finally{/*在该代码块中的代码一定会被执行,当然如果jvm都退出了这个自然就就是扯蛋了*/}
至此就说完了它的意义了,其实它的特殊性也就是这些个关键字了,只有异常这个体系的类才能使用这些关键字,别的都不行,这就是它的特殊性.
好吧,异常这个体系的意义和特殊性都说完了,也该说说这个体系的结构了.
很显然的 Throwable 就是这一体系中的老大了
而由于异常这类事物的表现形式是多种多样的,很自然的,它们也就形成了一个庞大的异常体系.但是总体上来说,可以分成两个大的体系,
一个是问题不是很大,可以被捕捉并处理的 Exception,
另一个就是问题相当严重的,都被称为错误了,可想而之问题有多严重了.不应该去捕捉并处理的异常 Error,
基于以上的分类,很显然的,学习的主要就是对Exception体系的异常的处理.在该体系中,也可以把其分成两大类:
在程序运行时才能检测到的运行时异常(RuntimeException),和在编译时就能检测到的编译时异常,
在RuntimeException体系中,在程序中如果出现了该体系中的异常,那么程序后续的代码都将变得没有意义,而这一类异常需要对代码进行修改.程序后续的代码的真正意义
才能体现出来,所以,在该体系异常出现时会直接中断程序的运行.对于该体系的异常不用去捕捉和处理它.直接让程序中止运行就是了.
而对于编译时异常,由于程序编译都不能通过,自然也就可以直接对代码进行修改了.但是,该类异常可以被捕捉和处理.
这么一看,啊,原来我们所要捕捉和处理的异常就只有Exception中除开RuntimeException以外的了,但是它还是相当庞大.不是吗?