java核心技术卷I-断言、日志
断言
断言机制允许在测试期间向代码中插入一些检査语句。当代码发布时,这些插人的检测语句将会被自动地移走。
Java 语言引人了关键字 assert。这个关键字有两种形式:
assert 条件;
assert 条件:表达式;
这两种形式都会对条件进行检测, 如果结果为 false, 则抛出一个 AssertionError 异常。在第二种形式中,表达式将被传人 AssertionError 的构造器, 并转换成一个消息字符串。
启用和禁用断言
在默认情况下, 断言被禁用。可以在运行程序时用 -enableassertions 或 -ea 选项启用:
java -enableassertions MyApp
需要注意的是, 在启用或禁用断言时不必重新编译程序。启用或禁用断言是类加载器(class loader) 的功能。当断言被禁用时, 类加载器将跳过断言代码, 因此,不会降低程序运行的速度。
使用断言完成参数检查
在 Java 语言中, 给出了 3 种处理系统错误的机制:
抛出一个异常
日志
使用断言
使用断言的情况
断言失败是致命的、 不可恢复的错误。
断言检查只用于开发和测阶段(这种做法有时候被戏称为“在靠近海岸时穿上救生衣,但在海中央时就把救生衣抛掉吧”)。
因此,不应该使用断言向程序的其他部分通告发生了可恢复性的错误,或者,不应该作为程序向用户通告问题的手段。断言只应该用于在测试阶段确定程序内部的错误位置。
记录曰志
可以调用 getLogger 方法创建或获取记录器:
private static final Logger myLogger = Logger.getLogger("com.mycompany.myapp"):
通常, 有以下 7 个日志记录器级别:
SEVERE
WARNING
INFO
CONFIG
FINE
FINER
FINEST
在默认情况下,只记录前夂个级别。 也可以设置其他的级別。例如
logger.setLevel(Level.FINE);
还可以使用 Level.ALL 开启所有级别的记录, 或者使用 Level.OFF 关闭所有级别的记录。
所有的级别有下面几种记录方法;
logger.warning(message):
logger.fine(message);
log 方法指定级别
logger.log(Level.FINE, message);
记录日志的常见用途是记录那些不可预料的异常。可以使用下面两个方法提供日志记录
中包含的异常描述内容。
void throwing(String className , String methodName , Throwable t)
void log(Level 1 , String message , Throwable t)
典型的用法是:
if (…) {
IOException exception = new IOException(". . .");
logger.throwing("com•mycompany.mylib.Reader", "read", exception) ;
throw exception;
}
调试技巧
1、可以用下面的方法打印或记录任意变量的值:
System.out.println("x=" + x);
Logger.getClobal().info(nx=" + x);
2、一个不太为人所知但却非常有效的技巧是在每一个类中放置一个单独的 main方法。这样就可以对每一个类进行单元测试。
利用这种技巧, 只需要创建少量的对象, 调用所有的方法, 并检测每个方法是否能够正确地运行就可以了。另外, 可以为每个类保留一个 main方法,然后分别为每个文件调用Java 虚拟机进行运行测试。在运行 applet 应用程序的时候, 这些 main方法不会被调用,而在运行应用程序的时候,Java 虚拟机只调用启动类的 main方法。
JUiiit 是一个非常常见的单元测试框架。
3、日志代理( logging proxy) 是一个子类的对象, 它可以截获方法调用, 并进行日志记录,然后调用超类中的方法。
4、利 用 Throwable 类提供的 printStackTmce 方法,可以从任何一个异常对象中获得堆栈情况。. 下面的代码将捕获任何异常,打印异常对象和堆栈轨迹, 然后,重新拋出异常, 以便能够找到相应的处理器。
try{
...
}
catch (Throwable t) {
t.printStackTrace();
throw t;
}
5、捕获堆栈轨迹到字符串
StringWriter out = new StringWriter();
new ThrowableO.printStackTrace(new PrintWriter(out));
String description = out.toString();
相关文章
- java项目添加log4j打印日志+转换系统时间
- 利用Java操作Jenkins API实现对Jenkins的控制详解
- nagios+logstash实时监控java日志(一)
- 小日志大问题——Logger的错误使用导致的JAVA进程CPU占用过高问题
- JAVA程序员工作常用英语
- 【Java】+快速打印数组
- java 排序多个条件
- java中关于如何运行jar格式程序的说明
- 检测网页地址有效性java代码
- JAVA日志库2
- Java日志框架slf4j剖析
- Java学习-061-Springboot logback 日志配置
- Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms
- java中的daemon thread
- Java异常处理基础知识笔记:异常处理机制、异常继承关系、捕获异常、抛出异常、异常的传播、异常调用栈、自定义异常、第三方日志库
- java -jar 设置日志位置
- java web 自定义错误页面 完整jsp错误页面代码(同时写错误日志) error.jsp
- Java数组的定义及用法
- JAVA优化篇 如何从茫茫日志中找到运行缓慢的线程
- Java 多态
- JAVA日志技术 & Logback