CoreJava读书笔记--异常、断言和日志(二)--断言和日志

使用断言

在一个具有自我保护能力的程序中,断言很常用。

(一)断言的概念

断言机制允许在测试期间向代码中插入一些检查语句。当代码发布时,这些插入的检测语句将会被自动地移走。Java语言引入了关键字assert。assert有两种形式:

assert 条件;

和

assert 条件 : 表达式;

这两种形式都会对条件进行检测,如果结果为false,则抛出一个AssertionError异常。在第二种形式中,表达式将被传入AssertionError构造器,并转换成一个消息字符串。表达式部分的唯一目的是产生一个消息字符串。例如:需要计算

double y = Math.sqrt(x);

我们知道x不能为负数,要想使用断言,只需要简单地使用assert语句,进行测试即可:

assert x>=0;

或者将x的实际值传递给AssertionError对象,从而可以在后面显示出来。

assert x>=0 : x;

(二)启用和禁用断言

在默认情况下,断言被禁用。可以在运行程序时用-enableassertions或-ea选项启用:

java -enableassertions MyApp

需要注意的是,在启用或禁用断言时不必重新编译程序。启用或禁用断言是类加载器(class loader)的功能。当断言被禁用时,类加载器将跳过断言代码,因此,不会降低程序运行的速度。

也可以在某个类或整个包中使用断言,例如:

java -ea:MyClass //断言某个类

java -ea:com.mycompany.mylib...MyApp  //断言某个包


//系统类不是由类加载器加载,所以不能用-ea 和-da,而是使用下面开关启用断言
-enablesystemassertions/-esa

也可以使用选项-disableassertions或-da禁用某个特定类和包的断言:

-da:MyClass MyApp

-disableassertions:MyClass

(三)使用断言完成参数检查

在Java语言中,给出了3种处理系统错误的机制:

  • 抛出一个异常
  • 日志
  • 使用断言

什么时候应该选择使用断言呢?

  • 断言失败是致命的、不可恢复的错误
  • 断言检查只用于开发和测试阶段

 注意:①不要在public方法里面检查参数是不是为null之类的操作

②不要用assert来检查方法操作的返回值来判断方法操作的结果

日志

我们总是用System.out.println方法调用来帮助观察程序运行的操作过程,但是太过复杂,记录日志API就是为了解决这个问题而设计的。下面看看记录日志API的优点:

①可以很容易的取消全部日志记录,或者仅仅取消某个级别的日志,而且打开和关闭这个操作也容易

②可以很简单的禁止日志记录的输出,因此,将这些日志代码留在程序中的开销很小

③日志可以被定向到不同的处理器,例如用于在控制台显示,用于存储在文件中

④日志记录器和处理器都可以对记录进行过滤,过滤器也可以根据实际制定过滤标准,丢弃那些无用的记录项

⑤日志记录可以采用不同的方式格式化,例如:纯文本或XML

⑥应用程序可以使用多个日志记录器,它们使用类似包名的这种具有层次结构的名字

⑦在默认情况下,日志系统的配置由配置文件控制

(一)基本日志

要生成简单的日志记录,可以使用全局日志记录器(global logger)并调用其info方法:

Logger.getGlobal().info("File->Open menu item selected");

也可以在适当地方调用关闭全局记录器的方法:

Logger.getGlobal().setLevel(Level.OFF);

将会取消所有的日志。

(二)高级日志

在一个专业的应用程序中,不要将所有的日志都记录到一个全局日志记录器中,而是可以自定义日志记录器。可以调用getLogger方法创建或获取记录器:

private static final Logger myLogger = Logger.getLogger("com.company.myapp");

提示:未被任何变量引用的日志记录器可能会被垃圾回收。为了防止这种情况发生,要像上面的例子中一样,用一个静态变量存储日志记录器的一个引用。

与包名类似,日志记录器名也具有层次结构。事实上,日志记录器也有级别,通常,有以下7个日志记录器级别:

  • SEVERE
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

在默认情况下,只记录前三个级别,也可以设置其他的级别。例如:

logger.setLevel(Level.FINE);

现在,FINE和更高级别的记录都可以记录下来。另外,也可以使用Level.ALL开启所有级别的记录,或者使用Level.OFF关闭所有级别的记录。

默认的日志记录将显示包含日志调用的类名和方法名,如同堆栈所显示的那样。但是,如果虚拟机对执行过程进行了优化,就得不到准确的调用信息。此时,可以调用logp方法获得调用类和方法的确切位置,这个方法的签名为:

void logp(Level lev,String className,String methodName,String message)

(三)修改日志管理器配置

可以通过编辑配置文件来修改日志系统的各种属性。在默认情况下,配置文件存在于:

jre/lib/logging.properties

要想使用另一个配置文件,就要将java.util.logging.config.file特性设置为配置文件的存储位置,并用下列命令启动应用程序:

java -Djava.util.logging.config.file=configFile MainClass

要想修改默认的日志记录级别,就需要编辑配置文件,并修改以下命令行

.level = INFO

可以通过添加以下内容来指定自己的日志记录级别

com.mycompany.myapp.level=FINE

之后可以看到,我们这么设置是不能在控制台上看到日志记录的,这是处理器的任务。另外,处理器也有级别。要想在控制台上看到FINE级别的消息,就需要进行下列设置:

java.util.logging.ConsoleHandler.level=FINE

(四)日志记录说明

①为一个简单的应用程序,选择一个日志记录器,并把日志记录器命名为与主应用程序包一样的名字。

②默认的日志配置将级别等于或高于INFO级别的所有消息记录到控制台上。

③所有级别为INFO、WARNING、SEVERE的消息都将显示到控制台上。因此,最好只将对程序用户有意义的消息设置为这几个级别。

猜你喜欢

转载自blog.csdn.net/zxyy2627/article/details/82802207