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。

  • 相关阅读:
    HDU 4278 Faulty Odometer 8进制转10进制
    hdu 4740 The Donkey of Gui Zhou bfs
    hdu 4739 Zhuge Liang's Mines 随机化
    hdu 4738 Caocao's Bridges tarjan
    Codeforces Gym 100187M M. Heaviside Function two pointer
    codeforces Gym 100187L L. Ministry of Truth 水题
    Codeforces Gym 100187K K. Perpetuum Mobile 构造
    codeforces Gym 100187J J. Deck Shuffling dfs
    codeforces Gym 100187H H. Mysterious Photos 水题
    windows服务名称不是单个单词的如何启动?
  • 原文地址:https://www.cnblogs.com/hanwuxing/p/12698908.html
Copyright © 2011-2022 走看看