Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么是;断言;你要做什么?_Java_Assert_Assertion - Fatal编程技术网

Java 什么是;断言;你要做什么?

Java 什么是;断言;你要做什么?,java,assert,assertion,Java,Assert,Assertion,断言做什么? 例如,在函数中: private static int charAt(String s, int d) { assert d >= 0 && d <= s.length(); if (d == s.length()) return -1; return s.charAt(d); } private静态整数字符(字符串s,int d){ assert d>=0&&d它确保表达式返回true。否则,它抛出一个java.lang.As

断言
做什么? 例如,在函数中:

private static int charAt(String s, int d) {
    assert d >= 0 && d <= s.length();
    if (d == s.length()) return -1;
    return s.charAt(d);
}
private静态整数字符(字符串s,int d){

assert d>=0&&d它确保表达式返回true。否则,它抛出一个
java.lang.AssertionError


assert
是一种调试工具,如果条件不为true,它将导致程序抛出一个
AssertionFailed
异常。在这种情况下,如果随后的两个条件中的任何一个计算为false,程序将抛出一个异常。一般来说,
assert
不应在生产c中使用颂歌

使用此版本的assert语句为AssertionError提供详细信息。系统将Expression2的值传递给相应的AssertionError构造函数,该构造函数使用值的字符串表示形式作为错误的详细信息

详细信息消息的目的是捕获并传达断言失败的详细信息。该消息应允许您诊断并最终修复导致断言失败的错误。请注意,详细信息消息不是用户级错误消息,因此通常不需要在isolat中使这些消息易于理解详细信息消息将在完整堆栈跟踪的上下文中解释,并与包含失败断言的源代码结合使用


如果不满足条件,将抛出一个
AssertionError

但是,必须启用断言;否则,
assert
表达式将不起任何作用。请参阅:


如果在启用断言的情况下运行应用程序,则断言确实会抛出断言错误

int a = 42;
assert a >= 0 && d <= 10;
inta=42;

如果使用
-enableassertions
(或简称
-ea
)启动程序,则断言a>=0&&d,然后执行以下语句

assert cond;
相当于

if (!cond)
    throw new AssertionError();
if (!(d >= 0 && d <= s.length()))
    throw new AssertionError();

如果在没有此选项的情况下启动程序,assert语句将无效


例如,
assert d>=0&&d断言通常主要用于检查程序的预期行为。在大多数情况下,它会导致崩溃,因为程序员对程序状态的假设是错误的。这就是断言的调试方面。它们创建了一个检查点,我们可以使用它如果我们想有正确的行为,就不能忽视


在您的案例中,它对传入参数进行数据验证,尽管它不能防止客户端将来误用该函数。特别是如果它们没有(也不应该)包含在发布版本中。

尽管我已经阅读了很多关于这一点的文档,但我仍然不清楚如何、何时以及在何处使用它

让理解变得非常简单:

当您遇到类似情况时:

assert d != null : "d is null";
    String strA = null;
    String strB = null;
    if (2 > 1){
        strA = "Hello World";
    }

    strB = strA.toLowerCase(); 
    assert strA != null; //Adding here
    strB = strA .toLowerCase();
您可能会收到警告(在strB=strA.toLowerCase();)上显示黄线),说明strA可能会为strB生成空值。尽管您知道strB是绝对的,但最终不会为空,以防万一,您可以使用assert来

1.禁用警告。

2.如果最糟糕的事情发生(当您运行应用程序时),则抛出异常错误。

有时候,当你编译你的代码时,你没有得到你的结果,这是一个bug。但是应用程序不会崩溃,你会花很长时间去寻找导致这个bug的原因

所以,如果你把assert放在下面:

assert d != null : "d is null";
    String strA = null;
    String strB = null;
    if (2 > 1){
        strA = "Hello World";
    }

    strB = strA.toLowerCase(); 
    assert strA != null; //Adding here
    strB = strA .toLowerCase();

您告诉编译器strA绝对不是空值,它可以“和平地”关闭警告。如果它为空(最坏的情况发生),它将停止应用程序并向您抛出一个bug来定位它。

它不一定会导致程序崩溃。事实上,您可以捕获一个
断言错误,就像任何其他异常一样。而且,由于断言需要显式启用才能产生任何效果,因此将它们放在生产代码中不会有任何伤害。啊,我的错误,是在C中吗那么,它们更麻烦?这可能是我记忆中的范例的地方…我必须说我同意。Java断言不应该用于生产代码中。也就是说,不应该告诉客户使用
-ea
开关启动。同意,断言不应该用于确保参数的有效性,而应该指出强有力的假设。使用
assert
测试非公共方法在我看来是完全有效的。如果客户有责任确保参数在范围内,那么使用assert是一种很好的编码方式。正如Bertrand Meyer(按合同设计)所说这个假设避免了重复检查。使用ILLCOLALGARMUMETUTExchange是一个公共API中的好样式。也可以看到这是一个相关的StasOp溢出问题。我在java中看到AsStReT非常像C++或C++中的调试宏。如果运行一些非常大的测试,可以使用它们。但是,在运行应用程序时,可以将它们排除在外。这样可以获得更快的性能。我不认为它真的被用作参数变量检查,但更深入地研究了可以检查各种变量的代码。例如“我们是否执行了4或5个循环,在所有条件下都只需要4个循环。我们是否应该从生产代码中删除包含
assert
的代码?”?