您的位置:首页 > 编程语言 > Java开发

java基础(四)之java浅析异常处理机制

2017-03-24 11:34 197 查看
引言:

异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。我们在处理文件时,需要考虑文件不存在等各种极端异常情况,这样才能更好的保证程序的健壮性。

一.异常的基本概念与分类

1.基本概念

       Throwable: 在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出)。Throwable 指定代码中可用异常传播机制通过 Java 应用程序传输的任何问题的共性。有两个重要的子类:Exception(异常)和Error(错误),二者都是 Java 异常处理的重要子类,各自都包含大量子类。

      1)  Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。

      2)  Exception(异常):是程序本身可以处理的异常。

   注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。具体概念等信息,可以看这篇文章异常处理机制

2.分类



二.异常的用法及若干注意事项

1.try catch finally 用法

try
{    //业务实现逻辑

...
}
catch(SubException e)
{
//异常处理块1
...
}
catch(SubException2 e)
{
//异常处理块2
...
}
...
finally
{
//资源回收块
...
}
1)在java语言中,通常将可能出现异常的语句放入try{}语句中,将出现错误后需要执行的语句放入到catch{}语句中,将无论是否发生异常都要执行的语句放在finally{}语句中。

2)当程序执行出现异常的时候,系统会抛出一个异常,然后由try{}语句中中出现异常的地方转到catch{}语句中。不过不管有没有异常产生,finally{}中的语句都将执行。

3)如果系统出现系统错误或者运行Runtime异常,jvm会结束程序运行,不一定会执行finally{}中的语句。

4)如果try{}中产生的异常在catch中没有处理,系统将停止程序,也不会执行finally中的语句。

5)如果存在多个异常,则安排顺序逐个匹配,匹配到则进行该异常代码处理,其他异常则不执行,相当于选择最近最合适的异常处理。所以越顶层的异常需要放在越后面。

2.若干注意事项

1)不要在finally块中使用renturn或throw等导致方法终止的语句,因为一旦使用,将会导致try块、catch块中的return、throw语句失效。

这里其实很好理解,在异常处理结束(return,throw等语句)之前进行finaly块处理。如果finally块中存在相应的结束语句(return,throw),则会先执行完成,导致catch块中相应结束语句失效。

public class testException {
public static void main(String[]args){
test();
}
public static  void test(){
int a=3;
try{
int s=a/0;
System.out.println(s);}
catch(Exception e){
System.out.println("执行catch");
throw new RuntimeException("catch 中抛出的异常");
}
finally{
System.out.println("执行finally");
throw new RuntimeException("finally 中抛出的异常");
}
}
}
程序执行结果:
Exception in thread "main" 执行catch
执行finally
java.lang.RuntimeException: finally 中抛出的异常
#如果finally中加入return语句,效果类似。
2)finally块不执行的情况:程序中使用退出语句system.exit(-1),硬件故障

package Server;
public class testException {
public static void main(String[]args){
test();
}
public static  void test(){
int a=3;
try{
int s=a/0;
System.out.println(s);}
catch(Exception e){
System.out.println("执行catch,即将退出");
System.exit(-1);
throw new RuntimeException("catch 中抛出的异常");
}
finally{
System.out.println("执行finally");
}
}
}
执行结果:
执行catch,即将退出

三.如何自定义异常及处理原则

1.自定义异常

对应上面的异常分类, 选择你
b1cc
要自定义的异常父类,我这里以RuntimeException

public class myException extends RuntimeException {
public myException(String mseg){
super(mseg);
}
}
2.抛出异常

使用throw关键字抛出异常,如 throw new Exception("my exception.....")

3.处理原则

知道如何处理该异常则在本层进行异常处理,不知道如何处理则抛出异常交给上一层调用者进行处理.

四.异常的其他应用场合

在java中break语句只能退出当前循环,然后对于多层循环无法退出,这时可以巧妙的利用异常进行多层循环退出

public class testException {
public static void main(String[]args){
process();
}
public static  void process(){
int i=0;
try{
while(true){
while(true){
i+=1;
System.out.println("i="+i);
if(i==3)
{
throw new Exception("退出循环");
}
}
}
}
catch(Exception e){
System.out.println("真的退出来了.....");
}
}
}
执行结果:
i=1
i=2
i=3
真的退出来了.....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: