可能重复:
What does assert do?
断言在开发期间测试程序员的假设,而不为异常编写异常处理程序当我搜索断言时,这就是我得到的。
除此之外,人们还说,它是异常处理的替代方案。当您不想花时间编写异常处理代码时,断言将会出现。但是,我没有得到工作和使用。有人解释这个例子。
class AssertExample {
public static void main(String[] args) {
int x = 0;
assert (x > 0) ? "assertion failed" : "assertion passed";
System.out.println("finished");
} }
答案 0 :(得分:3)
百科:
在计算机编程中,断言是放置在程序中的谓词(真假语句),表示开发人员认为谓词在该位置始终为真。断言的使用有助于程序员设计,开发和推理程序。
您可以使用-ea
开关在运行时启用断言。断言也可以有选择地启用
java -ea:pl.maciejziarko.service.UserService
关于断言的一些规则(来自SCJP Sun认证程序员Java 6学习指南):
答案 1 :(得分:2)
assert
不是处理异常的一种方法,它是检测它们的一种方式。 (因此,你发现的描述对我来说似乎有点不合适。)这基本上是一种说法:
这应该是真的。如果不是,则抛出错误。
如何处理该错误是一个完全不同的问题。您可以在检测到它的函数中处理它,您可以在调用它的函数中处理它,您可以在应用程序级别的堆栈顶部处理它等等。
请记住,捕获异常(它是正在使用的编程语言的构造)和有意义地处理异常(这是一个异常)之间存在显着差异逻辑构造独立于所使用的语言)。只捕获您可以做某些事情的例外情况。否则,让他们将堆栈冒泡到其他可以对其进行操作的代码。 (但是由于assert
没有捕获错误,它会抛出它们,它应该被用在你试图使用它的地方......可以检测到错误的点 ,即使它不能处理。)
看看你尝试使用assert
,看起来你很接近。这不是正确的用法:
assert (x > 0) ? "assertion failed" : "assertion passed";
你正在对assert
进行处理,好像它只是一个布尔值。然后,使用? :
运算符,你将该布尔值键入......好吧......并没有真正做任何事情。只需将字符串("assertion failed"
或"assertion passed"
)返回到不对该字符串执行任何操作的代码行。
关闭,但不完全。
assert
本身不只是检查条件。它通过抛出错误或允许代码路径继续来响应条件。它使用:
运算符,但不是? :
运算符的一部分。所以我认为你要做的是:
assert (x > 0) : "assertion failed";
这基本上是在说:
x应该总是大于0.如果不是,那就是非常错误。停止做任何事情并引发错误。
这将使用AssertionError
消息引发"assertion failed"
(当然,您希望将其替换为更有意义且更有用的消息,包括有关正在检查的值的任何有用的运行时信息帮助你调试。)
然后,在其他地方,你会处理AssertionError
并以某种方式回应它。
使用assert
与此类似的东西非常相似,只是更短,更具表现力:
if (x <= 0) throw new CustomException("assertion failed");
正如您所看到的,assert
只是更加清晰:
if
可能正在执行此操作,或者出于任何其他原因可能会出现新的代码路径。CustomException
执行相同的操作,但AssertionError
更常见/期望。答案 2 :(得分:0)
断言用于在开发期间验证有关代码的假设。
他们倾向于通过合同被用作穷人的设计。
例如,我使用它们来验证前/后条件和代码的不变量。