java异常处理

java异常处理

1.1 概念

异常机制可以使程序中的异常处理代码和正常业务代码分离,保证程序代码更加优雅,并可以提高程序的健壮性。

1.2 使用try…catch 捕获异常

在这里插入代码片 try{   
     //业务代码   
     ... 
  catch(Exception e){ 
     // 处理对应异常代码 
     .... 
}
如果执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给java运行时环境,这个过程叫做抛出异常。
当java运行时环境收到异常对象时,会寻找处理该异常对象的catch块,如果找到合适的catch块,则把该对象交给catch块处理,这个过程被称为捕获异常。如果java运行时环境找不到捕获异常的catch块,则运行环境终止,java程序也将退出。

1.3 异常的继承体系

try块后可以有多个catch块,这是为了针对不同的意外情况不同的处理方式,当系统发生不同的意外情况时,系统会生成不同的异常对象,java运行时就会根据该异常对象所属的异常类来决定使用哪个catch块来处理异常。
Error错误,一般指与虚拟机相关的问题,如系统崩溃,虚拟机错误,动态链接失败等,这种错误无法恢复或不可能捕获,将导致程序中断。
Java的异常被分为两大类:Checked异常和Runtime异常(运行时异常),所有的RuntimeException类及其子类的实例被称为Runtime异常,不是RuntimeException类及子类的异常实例则被称为Checked异常。
先处理小异常后处理大异常
 try{ 

  statements ... 

  }catch(RuntimeException e){  //1 

      System.out.println("运行时异常"); 

  }catch (NullPointerException e){ //2 

      System.out.println("空指针异常"); 

} 

1.4 java提供的多异常捕获

使用一个catch块捕获多种类型的异常时,多种异常类型之间用竖线(|)隔开

try{ 

        int a = Integer.parseInt(args[0]); 

        int b = Integer.parseInt(args[1]); 

        int c = a / b ; 

    }catch(IndexOutOfBoundsException | NumberFormatException | ArithmeticException e){ 

        System.out.println("程序发了上面异常的一种"); 

    }

1.5 访问异常信息

getMessage():返回该异常的详细描述字符串
printStackTrace():将该异常的跟踪栈信息输出
printStackTrace(PrintStream s):将异常的跟踪栈信息输出到指定输出流
getStackTrace():返回该异常的跟踪栈信息

1.6 使用finally 回收资源

JAVA的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存中所占用的内存。有时候程序在try块里打开了一些物理资源(数据库连接,网络连接,磁盘文件)这些物理资源都必须显式回收。

为什么要在finally中回收物理资源?

如果在try块里面回收,程序出现异常,就不会执行try块里面出现异常下面的代码。
如果在catch块里面回收,try块代码不出现异常,不会执行catch块代码。

1.7 Checked异常和Runtime异常体系

1. Checked异常与Runtime异常的区别?

对于程序中的Cheaked异常,Java要求必须显示捕获并处理异常(try{}catch{}),或者显式申明抛出该异常,这样添加了编程的复杂程度。
Runtime异常无需显式声明抛出,如果程序需要捕捉Runtime异常,也可以使用try…catch块来捕捉Runtime异常。
如果在方法中显示申明抛出Checked异常,将会导致方法签名与异常耦合,如果该方法是重写父类的方法,则该方法抛出的异常还会受到被重写方法所抛出异常的限制。(子类方法申明抛出的异常类型应该是父类方法申明抛出的异常类型的子类或相同)
Java认为Checked异常都是可以被处理(修复)的异常,所以Java程序必须显示处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误,无法通过编译.

2. Throws抛出异常与Throw抛出异常的区别

Throw,由于业务需求不符而产生的异常,必须由程序员来决定是否抛出,系统无法抛出这种异常。
throws声明抛出异常的思路是:当前方法不知道应该如何这种类型的异常,该异常应该由上一级调用者处理,如果main方法也不知道应该如何处理这种类型的异常,也可以使用throws声明抛出异常,该异常将交给JVM处理。JVM对异常的处理方法是:打印异常跟踪栈信息,并中止程序运行,这就是前面程序在遇到异常后自动结束的原因。
throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常类,多个异常类之间以逗号隔开。

1.8 自定义异常类

用户自定义异常都应该继承Exception基类,如果希望自定义Runtime异常,则应该继承RuntimeException基类,定义异常类时通常需要提供两个构造器,一个是无参数构造器,另一个是需要一个字符串参数的构造器,这个字符串作为该异常信息的描述信息(也就是异常对象的getMessage()方法返回的值)
   public class MyException extends Exception{ 

       //无参数的构造器 

        public MyException(){} 

        //带一个字符串的构造器 

        public MyException(String msg){ 

            super(msg); 

        } 
    }

1.9异常处理规则

不要使用过于庞大的try块
try块代码过于庞大,业务过于复杂,就会造成try块中出现异常的可能性大大增加,从而导致分析异常原因的难度也大大添加,而且catch块后面只能更大量的catch块来处理不同的异常,这样增加了编程复杂程度。
避免使用catch all
导致无法对不同的异常分情况处理。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值