java学习异常,断言和日志
1.异常处理的任务就是将控制权从错误产生的地方转移给能够处理这种情况的错误处理器
2.错误分类
用户输入错误
设备错误
物理限制
代码错误
3.异常分类,所有的异常都是由Throwable继承而来,有两个分支,Error和Exception
Error类层次结构描述类Java运行时系统的内部错误和资源耗尽错误,如果出现这样的错误,除了通告给用户,并尽力使应用程序安全的终止之外,在没有其它办法
Exception有两个分支,一个分支派生于RuntimeException;另一个分支包含其它异常;划分这两个异常的规则是,由程序错误导致的异常属于RuntimeException,而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其它异常
派生于RuntimeException的异常包含下面几种情况
错误的类型转换
数组越界访问
访问null指针
不是派生于RuntimeException的异常包含下面几种情况
试图在文件尾部后面读取数据
试图打开一个不存在的文件
试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在
4.如果存在RuntimeException异常,那么一定是你的问题
5.java语言规范将派生于Error类或RuntimeException类的所有异常称为非受查异常,其它所有的异常称为受查异常,编译器将会核查是否为所有的受查异常提供了异常处理器
6.方法应该在其首部声明所有可能抛出的异常,这样可以从首部反映出这个方法可能抛出那类受查异常
7.不必将所有可能抛出的异常都进行声明,遇到下面四种异常应该抛出
调用一个抛出受查异常的方法
程序运行过程中发现错误,并且利用throw语句抛出一个受查异常
程序出现错误
Java虚拟机和运行时库出现的内部错误
8.如果在子类中覆盖了一个超类的方法,子类方法中声明的受查异常不能比超类方法中声明的异常更通用,如果超类方法中没有抛出任何受查异常,那么子类也不能抛出任何受查异常
9.一旦方法抛出了异常,这个方法就不可能返回到调用者
10.如果某个异常发生的时候没有在任何地方进行捕获,那么程序就会终止运行,并在控制台上打印出异常信息,其中包括异常的类型和堆栈的内容
11.再次抛出异常与异常链,在catch语句中可以抛出一个异常,这样做的目的是改变异常的类型;也有可能是想记录一个异常,在将它重新抛出,不做任何改变
12.如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立刻退出
13.不管是否有异常被捕获,finally子句都会被执行
14.try语句可以只有finally语句,而没有catch语句
15.如果try块抛出一个异常,finally块中的处理也抛出一个异常,那么finally块中的异常将会被抛出,原始的异常将会丢失;要改进的话,在finally块中继续抛出原异常
16.带资源的try语句块(这样的语句块在正常退出或存在异常时都会调用res.close()方法)可以很好的处理上一种情况,原来的异常会重新抛出,close()方法抛出的异常会被抑制
17.堆栈轨迹是一个方法调用过程的列表,它包含了程序执行过程中方法调用的特定位置
18.早抛出,晚捕获
19.断言,假设确信某个属性符合要求,并且代码的执行依赖于这个属性;断言机制允许在测试期间向代码中插入一些检查语句,当代码发布时,这些插入语句的检测语句将会被自动的移走
20.在默认情况下,断言被禁用;在启用或禁用断言时不必重新编译程序,启用或禁用断言时类加载器的功能
21.断言失败是致命的,不可恢复的错误,断言检查只用于开发和测试阶段
22.记录日志的常见用途是记录那些不可预料的异常