assert
不是办法手柄例外,它是一种方法来检测他们。 (因此,你发现的描述对我来说看起来有点不合时宜。)这基本上是一种说法:
这应该是真的。如果不是,则抛出一个错误。
你如何处理这个错误是一个完全不同的问题。您可以在检测到它的函数中处理它,可以在调用它的函数中处理它,可以在应用程序级别的顶层处理它。
请记住, 捕获异常(这是使用的编程语言的构造)和有意义地处理异常(这是一种与正在使用的语言无关的逻辑结构)之间存在显着差异。只有抓住例外,你可以实际上做一些关于他们的事情。否则,让他们将堆栈中的代码吸引到其他可以对其进行操作的代码中。 (但是因为assert
不会捕获错误,所以它会抛出错误,它应该正好用在您尝试使用错误的地方......即使错误不可能是处理。)
看着你的尝试使用assert
,它看起来像你接近。这不是真正的正确用法:
assert (x > 0) ? "assertion failed" : "assertion passed";
你治疗assert
,仿佛这只是一个布尔值。然后,使用? :
运算符,您将该布尔键切换为...呃...并不真正做任何事情。只要将一个字符串("assertion failed"
或"assertion passed"
)返回到对该字符串不起任何作用的一行代码中。
关闭,但不完全。
assert
本身不仅仅是检查条件。它通过抛出错误或允许代码路径继续来响应条件。它使用运算符:
,但不作为? :
运算符的一部分。因此,我认为你正在试图做的是这样的:
assert (x > 0) : "assertion failed";
这基本上是说:
x应始终大于0如果不是,东西是非常错误的。不要做任何事情并提出错误。
这将提高与消息"assertion failed"
(其中,当然,你会希望有一个更有意义的和有用的信息,包括任何有用的运行信息,以取代有关被检查的值来帮助您进行调试)的AssertionError
。
然后,在其他地方,您将处理该AssertionError
并以某种方式对其作出响应。
使用assert
非常类似这样的事情,只有更短,多一点表现其意图:
if (x <= 0) throw new CustomException("assertion failed");
正如你所看到的,assert
只是在少许清洁剂,它:
- 使用特定的关键字来提醒人们注意,它只是为了验证假设而检查条件。
if
可能会这样做,或者由于任何其他原因它可能会分离新的代码路径。
- 抛出其可以远离其他错误待过滤的特定错误。请注意我使用
CustomException
做同样的事情,但AssertionError
是更常见的/预期的。
- 使用较少的代码。
- 演示真条件,相对于逆或假的条件。在大多数情况下,真实条件更易于阅读,并更清楚地表达代码的意图。
- 遵循惯例,更地道。
- 从代码的其余部分分开设置的代码作为用于特定的目的,指示其他开发人员断言应该仅断言。 (所以其他开发商不应该修改它作为第二代码路径,很可能加重副作用的说法。)
- 可以很容易地打开或关闭全球范围内为运行的应用程序。 Java允许您在任何给定的运行时环境中启用或禁用断言检查。这对于全局管理断言是一个交叉问题非常方便。
http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html – Guillaume
我不知道..但是,我发现这在谷歌上。你可以在这里检查此... http://wiki.answers.com/Q/What_does_the_assert_keyword_do_in_Java – Ravi