Java基础——异常

1、异常:java程序运行时发生的不正常情况,java会按照面对对象的思想对不正常的情况进行描述和对象封装。
*异常对象都派生于Throwable类的一个实例。

2、异常分为两种:
(1)Error:由系统底层发生的,描述了Java运行时的内部错误和资源耗尽错误,需要修改代码解决;
(2)Exception:由jvm发生,需要进行针对性的处理。Exception可分为两类:由程序错误导致的异常属于RuntimeException,而程序本身没问题,但由I/O错误这类问题导致的异常属于其他异常。
*派生于RuntimeException的异常:
错误的类型转换
数组访问越界
访问null指针
*不是派生于RuntimeException的异常:
试图在文件尾部读取数据
试图打开一个不存在的文件
试图根据给定的字符串查找Class对象,而字符串表示的类不存在
*派生于Error类或RuntimeException类的所有异常称为非受查异常(要么不可控制,要么应该避免),其他所有的异常称为受查异常。

3、会抛出异常的四种情况:
(1)调用一个抛出受查异常的方法;
(2)程序运行过程中发现错误,并利用throw语句抛出一个受查异常
(3)程序出现错误
(4)Java虚拟机和运行时库出现内部错误
*异常的原则:
(1)内部有异常抛出,功能上一定要throws声明(内部抛什么就声明什么),声明的目的是为了让调用者处理,若不处理,编译会失败;
(2)特殊情况:当函数内通过throws抛出了RuntimeException及其子类的异常对象时,函数可以不用throws声明,目的是为了不让调用者处理,终止程序,让调用者修改代码。

4、异常处理的两种方式:
(1)遇到异常不进行具体处理,而是继续抛给调用者(在函数上通过throw关键字声明异常,告诉调用者处理)
(2)针对性处理方式:捕获
*throw和throws的区别:
(1)位置不同:throws在函数上,后面跟异常类,可以跟多个;throw用在函数内,后面跟异常类对象;
(2)功能不同:throws用来声明异常,让调用者知道该功能可能出现的问题,并由调用者给出处理方式;throw给出具体的异常对象,执行到throw功能就结束了,跳转到调用者,具体问题对象也抛给调用者
*异常体系最大的特点就是体系中的类及其类产生的对象都具备可抛性,意为可被throws和throw所操作。

5、捕获异常必须设置try/catch语句块
try{
code
}
catch(ExceptionType e){
handler for this type
}
*若try语句块中的代码没有抛出任何异常,则程序将跳过catch子句;若方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,则方法会立刻退出。
*子类方法覆盖父类方法时,只能抛出父类方法异常或者该异常的子类。如果父类方法抛出多个异常,子类方法只能抛出父类异常的子集。
原则:子类异常必须要在父类的异常处理控制中。
注意:有一种情况必须只能try不能throws:被覆盖的方法没有抛出异常,那么子类在覆盖时子类方法中发生异常时只能try,无法throws声明。

6、finally子句作用:无论是否有异常发生,都要对资源进行释放。资源释放的动作就定义在finally代码块中。

7、异常处理方式try、catch、finally子句的组合方式:
(1)没有资源释放,仅仅是处理异常
try(){
….
}
catch(){
……
}
finally(){
……
}
(2)一个try,多个catch。一般是被调用的函数抛出多个异常,分别处理
try(){
….
}
catch(){
……
}
catch(){
……
}
catch(){
……
}
*注意:在多catch语法上特殊的地方是如果catch中的异常类存在子父类,则父类的catch一定要放在子类下面,否则编译失败。
(3)不一定要处理异常,但有资源需要释放
try(){
….
}
finally(){
……
}

8、分析堆栈轨迹元素
*堆栈轨迹(stack trace):一个方法调用过程的列表,它包含了程序执行过程中方法调用的特定位置。
*可以调用Throwable类的printStackTrace方法访问堆栈轨迹的文本描述信息;
*StackTraceElement类含有能够获取文件名和当前执行的代码行号的方法,还含有能够获取类名和方法名的方法。
*静态的Thread.getAllStackTrace方法,可以产生所有线程的堆栈轨迹

9、断言机制:允许在测试期间向代码中插入一些检查语句,当代码发布时,这些插入的检测语句会被自动移除。
*断言关键字assert,有两种形式:
(1)assert 条件;
(2)assert 条件:表达式;
两种形式都会对条件进行检测,若结果为false,则抛出一个AssertError异常。在第二种形式中,表达式将被传入AssertError的构造器,并转换成一个消息字符串。
*默认情况下,断言被禁用,可以在运行程序时用-enableassertions或-ea选项启用。要注意,在启用和禁用断言时不必重新编译程序,启用和禁用是类加载器的功能。当断言被禁用时,类加载器会跳过断言代码,不会降低程序运行速度。

10、Java的3种处理系统错误机制
(1)抛出一个异常
(2)日志
(3)断言
*断言失败是致命的、不可恢复的错误。断言检查只用于开发和测试阶段,只应该用于在测试阶段确定程序内部的错误位置。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值