Java异常处理与断言

学习Java,一定要懂得如何面对对象,说白了就是要懂得如何区分抽象与实例的区别,理所当然的,对于Java异常处理来说,它也是采用面对对象思想的

异常处理结构层次(图片来源网上)
这里写图片描述

从上图可以看出,所有的异常都是父类object的子类,并且都是继承于Throwable这个异常,它有ErrorException两个子类。
Error类描述的主要是Java中内部系统错误及资源耗尽情况下的错误。
Exception类下面主要分为Runtime Exception类和其他异常类。

只要不是被程序员捕获的异常,最终都会被默认异常处理程序处理。默认处理程序会打印出异常的类型和异常发生时所处的堆栈,并立即终止程序运行。

注意(区别检测异常和不检查异常):

不检查异常是指对Error类及其子类和RuntimeException类及其子类
检测异常就是其他异常类

在Java处理异常主要有两种方式,一种是使用try………..catch………..finaly,另外一种时使用throws关键字将异常传递出来。

1、try……….catch………..finaly

try{
       //可能抛出异常的语句
        }catch(异常类型1 异常对象名){
    //处理异常的语句
        }catch(异常类型2 异常对象名){
    //处理异常的语句
        }catch(异常类型3 异常对象名){
    //处理异常的语句
        }

try语句不能独立存在,其后至少要有一个catch或者finally语句块。finally语句块不是必须存在的,但当存在时它一定会运行(与switch中的defalut有点像)。
但是,以下情况不会执行finally

1、在finally语句块前执行了System.exit()退出运行
2、在finally语句块之前,程序所在的线程死亡。

finally与return

在执行try或catch语句块中的return语句时,假如有finally语句块,则优先执行finally语句块,
注意: fnally代码块不能通过重新给变量赋值的方式来改变return语句的返回值
eg:下面运行结果为2
public class test{
public static void main(String []args){
int n=fun(2);
System.out.print(n);
}
public static int fun(int i){
try{
return i++;
}finally {
i=i+8;
}
}
}

  • 使用多个catch语句块时会有一个问题,即catch语句捕获异常是按照顺序的,如果前面已经有一个异常类型被捕获了,但又同时满足后面的异常类型时,后面的就不会被捕获了,因此一般将最细化的异常类放在前面,父类放在后面

try……….catch………..finaly语句中可以使用以下几个方法输出异常信息

·getMessage():输出异常的性质
printStackTrace():输出该异常的类型、性质、栈以及出现在程序中的位置
getStackTrace():返回该异常的跟踪栈信息。
toString():输出该异常的类型和性质

一般来说try也是可以嵌套的,在一个try语句块内可以定义另一个try语句块,每次进入try语句块,异常的前后关系都会被推进某个堆栈,如果内部的try语句块不含适合的catch处理程序,堆栈将其弹出,而匹配下一个try语句块。这个过程会持续到匹配的catch语句块或知道所有的前提try语句块被检测完毕。若此时还没有找到合适的异常处理程序,那么将由默认的异常处理程序自动处理这个异常。

注意:

若重写方法时遇到了异常:
1、子类的异常应该小于或等于父类的异常
2、若父类没有声明异常(就是没有throws关键字),则子类重写方法不可以声明抛出检查异常,但可以抛出不检查异常(前面有定义)
3、若父类声明了异常,,那么子类可以不声明异常,若子类声明了异常,则该异常应小于或等于父类的异常,而不能是其他检查异常。

throws

例子

public static void main(String []args) throws 异常类型{

}

如果一个方法中抛出的异常没有在catch语句块中找到合适的异常处理程序,Java就会立即退出该方法。使用throws声明异常,可以将异常传递出去。若传递给main方法时,main方法也将异常抛出,那么main会将异常抛出给JVM,JVM会自动调用默认异常处理程序处理,即中断程序执行退出。

注意:

抛出异常的方法声明的异常类型不能比调用处处理的异常类型范围大,否则在编译时会报错。

throw

throws是声明异常类型,而throw是抛出异常实例,
throw后面不能紧跟其他语句,因为这些语句没有机会被执行!
注意:

使用throws关键字抛出不检查异常时,不需要在方法头部声明方法可能抛出的异常类型,而抛出检查异常时,必须在方法头部声明方法可能抛出的异常类型。

断言

格式一:
assert 布尔表达式

格式二:
assert 布尔表达式:细节描述信息

如果布尔表达式为True,啥事也没有,若布尔表达式为False,则会抛出异常,且有细节描述信息。

小结

这一块,简单,try …..catch ……..finally,throws,throw ,assert,主要是为测试服务的,一般现阶段用的比较少,纯属混个记忆,等到用时再来复习一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值