2012-11-04 124 views
2

可能重复:
What does assert do?什么是Java中使用断言的

断言测试在开发过程中程序员的假设,而无需编写异常处理程序的异常这是我得到了什么,当时我正在搜索声称

除此之外,人们也表示,这是异常处理的替代方案。 当您不想花时间编写异常处理代码时,断言将会出现在图片中。但是,我没有得到工作和使用。任何人都解释这个例子

class AssertExample { 

    public static void main(String[] args) { 
     int x = 0; 
     assert (x > 0) ? "assertion failed" : "assertion passed"; 
     System.out.println("finished"); 
    } } 
+0

http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html – Guillaume

+0

我不知道..但是,我发现这在谷歌上。你可以在这里检查此... http://wiki.answers.com/Q/What_does_the_assert_keyword_do_in_Java – Ravi

回答

2

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允许您在任何给定的运行时环境中启用或禁用断言检查。这对于全局管理断言是一个交叉问题非常方便。
+0

复制粘贴!!!!!! –

+0

@BhavikAmbani:对不起?你能更清楚你的意思吗? – David

0

断言是用于在开发期间验证有关您的代码的假设。

他们往往被用作一种穷人的合同设计。

例如,我使用它们来验证代码的前/后条件和不变量。

3

百科:

在计算机编程中,断言是放置在一个程序中的谓词(真伪语句),表明开发商认为,谓词是始终在那个地方真的。断言的使用有助于程序员设计,开发和推理程序。

您可以在运行时使用-ea开关启用断言。断言也可以选择

java -ea:pl.maciejziarko.service.UserService 

启用断言左右(对于Java 6的学习指南从SCJP Sun认证程序员)一些规则:

  • 不要使用断言验证参数的公共方法
  • 使用断言来验证私有方法的参数
  • 不要使用断言来验证命令行参数
  • 使用断言来检查个案t帽子您所知道的永远,永远 应该发生
  • 不要使用断言表达式可引起副作用
+0

我会明白,如果你也和我的例子来解释。 :-) – Ravi