如何开启Java的断言?

来源:互联网 发布:飞机杯推荐知乎 编辑:程序博客网 时间:2024/06/07 22:41


由老贾问到断言如何开启。于是上网搜索一番。做个记录。

命令行下:
java -ea AssertTest
-da是禁用断言

JVM默认是关闭了assertion功能的,所以要使用assertion功能的话必须显式使用加入参数来选择启用或者禁用断言。
另外,断言的参数可以使得java应用程序可以开启一部分类或包的assertion功能,所以运行相对编译而言,比较复杂,这里有两类参数需要说明:

 

public class TestAssert{
      public static void main(String[] args){
         int x = 1;
         assert x < 0;
         System.out.println("ok");
   }
}


Run ---> Run Configurations ---> 选择 Arguments 选项卡
在 VM arguments 文本框中输入“-ea” 如果输入 -da 表示禁止断言

 

引自:http://blog.csdn.net/silentbalanceyh/archive/2009/09/18/4564884.aspx
编译和运行:
【编译】
  由于assert是JDK 1.4才出来的关键字,使用老版本的JDK是无法编译带有assert的程序的,因此在使用javac命令编译该代码的时候,必须使用JDK 1.4或者更新的Java编译器,如果编译的时候因为无法识别assert关键字报错,那么需要加上编译参数-source 1.4这里的版本号至少是1.4或者以上的。直接使用javac命令编译的时候-source 1.4表示使用JDK 1.4版本的方式来编译源代码,版本太低带有assert关键字的代码就无法通过编译。关于javac和java命令的内容后边会有专程的章节介绍
【运行】
  在运行带有assert语句的程序时,使用了新的ClassLoader的Class类,因此必须保证程序在JDK 1.4以及以上的版本或者JRE 1.4以及以上的版本环境里面运行。而在运行的时候,因为JVM默认是关闭了assertion功能的,所以要使用assertion功能的话必须显式使用加入参数来选择启用或者禁用断言。另外,断言的参数可以使得java应用程序可以开启一部分类或包的assertion功能,所以运行相对编译而言,比较复杂,这里有两类参数需要说明:
  [1]参数-esa和-dsa:
  该含义为开启(关闭)系统类的assertion功能。由于新版的Java的系统类中,也使用了assertion语句,如果用户需要观察它们本身的运行情况就需要打开assertion功能,可以使用参数-esa参数打开,使用-dsa参数关闭。 -esa和-dsa的全名为-enablesystemassertions和-disenablesystemassertions,全名和缩写名具有同样的效果。
  [2]参数-ea和-da:
  它们的含义为开启(关闭)用户类的assertion功能:通过使用该参数,用户可以打开某些类或者包的assertion功能,同样用户也可以关闭某些类和包的assertion功能。打开assertion功能的参数为-ea;如果不带任何参数,表示打开所有用户类;如果带有包名称或者类名称,就表示打开这些类或包的assertion功能。-ea和-da的全名为-enableassertions和-disenableassertions
  这里提供一个表格来说明运行时断言参数的用法
参数 例子 说明
-ea java -ea 打开所有用户类的assertion
-da java -da 关闭所有用户类的assertion
-ea:<classname> java -ea:AssertionDriver  开打AssertionDriver类的assertion
-da:<classname> java -da:AssertionDriver 关闭AssertionDriver类的assertion
-ea:<packagename> java -ea:packagename 打开packagename包的assertion
-da:<packagename> java -da:packagename 关闭packagename包的assertion
-ea:... java -ea:... 打开缺省包(无名包)的assertion
-da:... java -da:... 关闭缺省包(无名包)的assertion
-ea:<packagename>... java -ea:packagename... 打开packagename包以及其子包的assertion
-da:<packagename>... java -da:packagename... 关闭packagename包以及其子包的assertion
-esa java -esa 打开系统类的assertion
-dsa java -dsa 关闭系统类的assertion
综合使用 java -dsa:ClassOne:pkgOne 关闭ClassOne类和pkgOne包的assertion
在上边的表格里面,需要说明的是:
  [1]...代表该包和该包对应的子包,如果系统有两个包分别为pkgOne和pkgOne.subpkg,则pkgOne...就代表这两个包
  [2]可是使用编程的方式来禁用或者启用assertion,下边提供一段代码来说明该功能:编程方式的assertion
/**
 *使用程序开启断言的代码段
 **/
class Loaded
{
    public void go()
    {
        try
        {
            assert false:"Loaded.go()";
        }
        catch(AssertionError error){
            System.out.println(error);
        }
    }
}


public class LoaderAssertions
{
    public static void main(String args[])
    {
        ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
        new Loaded().go();
    }
}
  直接运行上边的代码会有下边的输出:
java.lang.AssertionError: Loaded.go()
  除了上边的代码使用的setDefaultAssertionStatus方法以外,ClassLoader的API里面还有以下几种方法:
  setDefaultAssertionStatus:用于开启/关闭assertion功能
  setPackageAssertionStatus:用于开启/关闭某些包的assertion功能
  setClassAssertionStatus: 用于开启/关闭某些类的assertion功能
  clearAssertionStatus:用于关闭assertion功能