异常
- 异常处理的任务就是将控制权从错误产生的地方转移给能够处理这种情况的错误处理器
- 在java中,如果某个方法不能够采用正常的途径完成它的任务时,方法不会返回任何值,而是抛出一个封装了错误信息的对象,同时方法会立刻退出,调用这个方法的代码也将无法继续执行,这时候异常处理机制开始搜索能够处理这种异常状况的异常处理器
- 所有的异常都是由Throwable继承而来,下一层分解为Error和Exception,Exception又分解为IOException和RuntimeException
- Error:描述了java运行时系统的内部错误和资源耗尽错误,这类错误很少出现,应用程序也不应该抛出这类对象
- RuntimeException:由于程序本身业务逻辑错误导致的异常,此类异常多半是由于程序本身设计的问题导致的,比如错误的类型转换等
- IOException:由于类似I/O错误的问题导致的异常
- 派生自Error类或者RuntimeException类的所有异常称为非受查异常(unchecked),将所有其他异常称为受查异常(checked)。对于非受查异常要么是不可控制(Error)要么就应该避免发生(RuntimeException);对于受查异常,是可以提前知道可能会出现的错误的(比如文件不存在的情况)。所以一个方法必须声明所有可能抛出的受查异常,而尽可能保证代码的正确性来避免非受查异常的出现,而非受查异常比如数组越界这种程序中存在的问题应该专注于核查程序本身而不是通过抛出异常来解决。
- 子类中覆盖超类的方法,子类方法中声明的受查异常不能比超类方法中声明的异常更通用
- 如果调用了一个抛出受查异常的方法,就必须对它进行处理,或者继续传递。通常应该捕获知道如何处理的异常而将不知道如何处理的异常进行传递。在方法的首部添加throws说明符以告知调用者这个方法可能会抛出异常。除非覆写一个超类中并没有抛出异常的方法时,要捕获方法代码中的每一个受查异常
- 当代码抛出一个异常时,就会终止方法中剩余代码的处理,并退出这个方法的执行,这样一些没有来得及回收的资源就没有成功回收,所以可以使用finally字句中进行资源回收,确保无论try语句是否抛出异常都可以及时做到资源回收。
- 可以使用带资源的try语句解决finally中也可能出现受查异常的情况
断言
- 断言是一种测试和调试阶段所使用的工具,断言机制允许在测试期间向代码中插入一些检查语句,当代码发布的时候这些插入的检测语句将会被自动移走
- 断言的语法规则如下,这两种方式都会对条件进行检测,如果为false就抛出一个AssertionError异常,在第二种形式中,表达式就作为一条字符串传入AssertionError构造器,转换成消息字符串
- assert 条件;
- assert 条件:表达式; —— 这里表达式就可以理解成字符串
- 运行程序时可以使用-enableassertions或-ea参数启用断言
日志
- 全局日志记录(global logger)
Logger.getGlobal().info("test");
Logger.getGlobal().serLevel(Level.OFF); - 可以使用getLogger方法创建或获取记录器,未被任何变量引用的日志记录器可能会被垃圾回收,所以可以使用静态变量存储日志记录器的一个引用
private static final Logger myLogger = Logger.getLogger("com.mycompany.myapp");
- 日志记录器有7个级别
- SERVER
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
- 可以使用Level.ALL开启所有级别的记录,使用Level.OFF关闭所有级别的记录