异常处理

Java的异常机制主要依赖于try,catch,finally,throw和throws五个关键字。

try:后紧跟一个花括号括起来的代码块(花括号不可以省略),简称try块,它里面放的是可能引发异常的代码块。

catch:后面对应异常类型和代码块,用于表明该catch块用于处理这种类型的代码块。

finally:多个catch块后还可以跟一个finally块,finally块用于回收在try块里打开的物理资源,异常机制会保证finally块总被执行。

throws:主要在方法签名中使用,用于声明该方法可能抛出的异常。

throw:用于抛出一个实际的异常,throw可以单独作为语句使用,抛出一个具体的异常对象。

异常处理机制:

目的:让程序具有极好的容错性,增加程序的健壮性。(当程序出现意外清醒时,系统会自动生成一个Exception对象来通知程序,实现了“业务功能实现代码”和“错误处理代码”分离),为程序提供更好的可读性。

将系统的业务实现代码放在try块中定义,所有的异常处理逻辑放在catch块中进行处理。

try{
  //业务实现代码
  ……
}
catch(Exception e){
  alert 输入不合法
  goto retry;
}

抛出异常:如果执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给Java运行时环境。

捕获异常:当java运行时环境收到异常对象时,会寻找能处理该异常对象的catch块,如果找到合适的catch块,则把该异常对象交给catch块处理。

异常类的继承体系:当Java运行时环境接收到异常对象后,会依次判断该异常对象是否是catch块后异常类或者其子类的实例,如果是,Java运行时环境将调用该catch块来处理该异常,否则再次拿该异常对象和下一个catch块里的异常类进行比较。

注:try块后的花括号不可以省略,即使try块里只有一行代码,也不可以省略花括号,catch块后的花括号也不可以省略,try块里声明的变量是代码块局部变量,它只在try块内有效,在catch块中不能访问该变量。

Java把所有的非正常情况分为两种:异常(Exception),错误(Error)

Error错误:一般是指与虚拟机相关的问题(系统崩溃,虚拟机错误,动态链接失败等),这种错误无法恢复或者不可能捕获,导致程序中断。因此应用程序不应该试图使用catch块来捕获Error对象。

进行异常捕获时应该将所有的父类异常的catch块排在子类异常的catch块后面(先处理小异常,再处理大异常)否则将会出现编译错误。

多异常捕获:

使用一个catch块捕获多种异常时注意:①捕获多种类型的异常时,多种异常类型之间用竖线(|)隔开。②捕获多种类型的异常时,异常变量有隐式的final修饰,因此程序不能对异常变量重新赋值。捕获一种类型的异常时,异常变量没有final修饰。

访问异常信息:

所有的异常对象都包含的常用方法:

getMessage():返回该异常的详细描述字符串。

printStackTrace():将该异常的跟踪栈信息输出到标准错误输出。

printStackTrace(PrintStream s):将该异常的跟踪栈信息输出到指定输出流.

getStackTrace():返回该异常的跟踪栈信息。

使用finally回收资源:

Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只能回收堆内存中对象所占用的内存。

异常处理语法结构中只有try块是必须的,也就是说,如果没有try块,则不能有后面的catch块和finally块,catch块和finally块都是可选的,但catch块和finally块至少出现其中之一。可以有多个catch块,捕获父类异常的catch块必须位于捕获子类异常的后面,但是不能只有try块,既没有catch块,也没有finally块,多个catch块必须位于所有的catch块之后。如果在异常处理代码块中使用System.exit(1)语句来退出虚拟机,则finally块将会失去执行的机会。一旦在finally块中使用了return或throw语句,将会导致try块,catch块中的return,throw语句失效。

Checked异常和Runtime异常体系

java的异常被分为:Checked异常和Runtime异常(运行时异常),所有的RuntimeException类及其子类的实例被称为Runtime异常,不是RuntimeException类及其子类的异常实例则被称为Checked异常。checked异常是可以被修复的异常,所以Java程序必须显式地处理Checked异常。

Checked异常的处理方式:①当前方法明确知道如何处理该异常,程序应该使用try…catch块来捕获该异常,然后在对应的catch块中修复该异常。②当前方法不知道如何处理这种异常,应该在定义该方法时声明抛出该异常。

throws声明抛出只能在方法签名中使用,throws可以声明抛出多个异常类,多个异常类之间用逗号隔开,

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值