zoukankan      html  css  js  c++  java
  • assert断言——调试中不应该是syso

     

    断言是为了方便调试程序,并不是发布程序的组成部分。理解这一点是很关键的。

    默认情况下,JVM是关闭断言的。因此如果想使用断言调试程序,需要手动打开断言功能。在命令行模式下运行Java程序时可增加参数-enableassertions或者-ea打开断言。可通过-disableassertions或者-da关闭断言(默认情况,可有可无)。

    断言的使用:

    断言是通过关键字assert来定义的,一般的,它有两种形式。

    1. assert <bool expression>;       比如     boolean isStudent = false; assert isStudent;

    2. assert <bool expression> : <message>;    比如  boolean isSafe = false;  assert isSafe : "Not Safe at all";

    光说无用,举几个简单的例子:

    第一种形式:

    1.  
      public class AssertionTest {
    2.  
       
    3.  
      public static void main(String[] args) {
    4.  
       
    5.  
      boolean isSafe = false;
    6.  
      assert isSafe;
    7.  
      System.out.println("断言通过!");
    8.  
      }
    9.  
      }

    如果是在命令行模式下运行,需要指明开启断言功能。如

    java -ea AssertionTest
     

    如果是在IDE下,比如Eclipse,可这样设置: Run as -> Run Configurations -> Arguments -> VM arguments:敲入-ea即可。

    输出结果:

    Exception in thread "main" java.lang.AssertionError
    	at AssertionTest.main(AssertionTest.java:8)
    


    第二种形式:

    1.  
      public class AssertionTest {
    2.  
       
    3.  
      public static void main(String[] args) {
    4.  
       
    5.  
      boolean isSafe = false;
    6.  
      assert isSafe : "Not safe at all";
    7.  
      System.out.println("断言通过!");
    8.  
      }
    9.  
      }

    输出结果:
    Exception in thread "main" java.lang.AssertionError: Not safe at all
    	at AssertionTest.main(AssertionTest.java:7)
    

    第二种形式和第一种的区别在于后者可以指定错误信息。

    陷阱:

    断言只是为了用来调试程序,切勿将断言写入业务逻辑中。比如考虑下面这个简单的例子:

    1.  
      public class AssertionTest {
    2.  
       
    3.  
      public static void main(String[] args) {
    4.  
       
    5.  
      assert ( args.length > 0);
    6.  
      System.out.println(args[1]);
    7.  
      }
    8.  
      }

    该句assert (args.length >0)和if(args.length >0)意思相近,但是如果在发布程序的时候(一般都不会开启断言),所以该句会被忽视,因此会导致以下
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    	at AssertionTest.main(AssertionTest.java:7)

    更好的替代品:

    JUnit。

  • 相关阅读:
    TP之Model(select(),add())
    TP之空操作及View模块
    ThinkPHP之初识
    smarty引擎之练习
    领先环境HTML
    php流程
    分页
    弹窗
    邮箱项目
    TP框架修改操作
  • 原文地址:https://www.cnblogs.com/hanwuxing/p/12698908.html
Copyright © 2011-2022 走看看