zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java核心技术卷I-断言、日志

JAVA日志 核心技术 断言
2023-09-27 14:19:45 时间

断言

断言机制允许在测试期间向代码中插入一些检査语句。当代码发布时,这些插人的检测语句将会被自动地移走。
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();