JAVA核心技术卷I(异常、断言和日志)
一、异常
Throwable
- Error
- Exception
- IOException
- RuntimeException
1.1 创建异常
派生于Exception的类,或者派生于Exception的子类。
包含两个构造器,一个无参的,一个带String参数的。
获得Throwable的详细信息 String getMessage()
1.2 异常捕获
捕获你知道如何处理的异常,而继续抛出你不知道怎么处理的异常。
1.3 再次抛出异常
包装一个异常:
java
try { |
设置原始异常:
java
try { |
只是添加一个记录:
java
try { |
1.4 try-with-Resources
假设资源实现了一个AutoCloseable接口。
java
try(Resource res = ... [; ...]) { |
try退出时候,会自动调用res.close()
1.5 堆栈轨迹
可以调用 e.printStackTrace
还有一种方法 JDK9:
java
var walker = StackWalker.getInstance(); |
1.6 使用异常的技巧
异常处理不能代替简单的测试
javaif (!s.empty()) s.pop();
// 646毫秒
-----------------------------------------
try {
s.pop();
} catch(Exception e) {}
// 21739 毫秒花费时间大,因此只在异常情况下使用异常。
不要过分地细化异常
即每个语句都来一个try,可以合到一个try,然后多个catch
充分利用异常层次结构
不要只抛出RuntimeException异常。应该寻找一个合适的子类或创建自己的异常类。
不要压制异常
再检测所错误的时候,”苛刻“总比放任好。
不要羞于传递异常
二、断言
断言是一种测试和调试阶段使用的战术性工具!
Java中给出了三种处理系统错误的机制:
- 抛出一个异常
- 日志
- 使用断言
什么时候使用呢?
- 断言失败是致命的、不可恢复的错误
- 断言检查只是再开发和测试阶段打开
三、日志
打印日志信息主要有2步(这里以log4J为例):
配置日志属性
properties### set log levels ###
INFO,Console,File =
### 输出到控制台 ###
org.apache.log4j.ConsoleAppender =
System.out =
org.apache.log4j.PatternLayout =
%d{yyyy-MM-dd HH:mm:ss,SSS}] [%t] [%c] [%p] - %m%n =编写Java代码
javapublic class LoggerGenerator {
// 创建日志对象
private static Logger logger = Logger.getLogger(LoggerGenerator.class.getName());
public static void main(String[] args) throws InterruptedException {
int index = 0;
while (true) {
Thread.sleep(1000);
// 指定日志等级输出内容
logger.info("current value is : " + index++);
}
}
}