如何开启Java的断言?


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

命令行下:
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.youkuaiyun.com/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功能

<think>嗯,用户问的是“什么是断言?”。首先,我需要确定用户是在什么上下文中提到断言的。断言这个词在编程、逻辑学、甚至日常生活中都有不同的含义,但考虑到用户可能是在编程或者软件测试的背景下提问,因为技术领域中使用“断言”更为常见。 接下来,我得回忆一下断言在编程中的定义。记得断言是一种用于检查程序中的条件是否为真的机制,通常在调试中使用。当断言的条件不满足时,程序会抛出错误,帮助开发者识别问题所在。 然后,应该考虑用户可能的背景。可能是刚开始学习编程的新手,或者对调试方法不熟悉的人。需要解释得简单易懂,避免使用过于专业的术语,但又要准确。 接下来,要组织回答的结构。首先定义断言,然后说明它的用途,比如调试、验证假设、文档化代码。再举一个例子,比如Python中的assert语句,或者其他语言如Java中的用法。这样用户能更直观地理解。 还要注意用户提到的系统级指令,比如数学公式需要用正确的LaTeX格式。虽然这个问题不涉及数学,但如果有例子中的计算,可能需要使用,比如说明断言中的条件表达式,但可能这里用不上,但需要留意。 另外,需要确保回答的结构清晰,分点说明,可能用编号或者小标题。用户要求逐步解决问题,所以可能需要分步骤介绍断言的作用、使用场景和示例。 还要检查是否有常见的误解需要澄清,比如断言和异常处理的区别,或者断言在发布版本中通常被禁用的情况。这些补充信息能帮助用户更全面地理解。 最后,确保语言口语化,避免生硬,同时保持专业性。例如,用“简单来说”这样的引导词,让解释更亲切。例子部分要具体,比如给出一个除法的例子,说明断言如何检查除数不为零,这样用户容易联想到实际应用场景。 总结一下,回答的结构大概是: 1. 定义断言 2. 主要用途(调试、验证假设、文档化) 3. 示例代码 4. 注意事项(与异常处理的区别,发布版本中的处理) 5. 总结 现在需要检查是否有遗漏点,比如断言在测试中的作用,或者在不同编程语言中的实现差异。可能提到不同语言的具体语法,但保持一般性,然后举一两个例子即可。 确保不使用Markdown格式,用自然的分段和编号。同时,注意中文表达的正确性,避免错别字或语法错误。</think>**断言(Assertion)** 是一种在程序中用于验证假设是否成立的机制,通常用于调试和测试。简单来说,它是一句“声明式检查”,确保某个条件在特定位置一定为真。若条件不成立,程序会立即终止或抛出错误,帮助开发者快速定位问题。 --- ### **断言的核心作用** 1. **调试辅助** 在代码中插入断言,可验证变量、计算结果的合理性。例如: ```python def divide(a, b): assert b != 0, "除数不能为0" # 断言:确保b不为0 return a / b ``` 若`b=0`,程序会抛出`AssertionError`并提示信息,直接暴露问题。 2. **验证假设** 开发中常隐含假设(如“输入非空”“计算结果为正”)。断言可显式检查这些假设,防止隐藏的逻辑错误。 3. **代码自文档化** 断言条件本身描述了代码的预期行为,相当于一种“活注释”。 --- ### **断言 vs. 异常处理** - **断言**:针对程序内部逻辑错误(即不应发生的情况),通常用于调试阶段。 - **异常处理**:处理预期内的外部错误(如用户输入错误、文件不存在等),需在发布版本中保留。 --- ### **注意事项** - **发布版本中禁用断言** 多数语言(如Python、Java)默认在发布时禁用断言以提高性能。因此,断言不可用于关键错误处理。 - **避免副作用** 断言条件中不应包含影响程序逻辑的操作。例如: ```python assert update_database(), "数据库更新失败" # 错误!断言可能被禁用,导致操作不执行 ``` --- ### **总结** 断言是开发者的“代码保镖”,用于主动捕捉逻辑漏洞。它强调“快速失败”(Fail Fast),确保问题在早期被发现,而非遗留到后续阶段。合理使用断言,能显著提升代码健壮性!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值