在java中使用assert和抛出AssetionError异常之间的区别

时间:2013-04-03 13:14:19

标签: java exception exception-handling

要进行内部逻辑检查,Java中有两种方法,

  1. 使用assert关键字:例如,断言(x> y);
  2. 手动抛出断言错误:例如, if(y> x)抛出新的AssertionError();
  3. 上述两种方法有何不同(性能方面,编程灵活性等? 哪一个被认为是一个很好的编程实践?

4 个答案:

答案 0 :(得分:9)

主要区别在于不保证assert被处理,除非明确启用断言(通过java的-ea选项或以编程方式)。另一方面,抛出new AssertionError()将始终有效。

一些阅读信息:Programming with Assertions

答案 1 :(得分:1)

方式#1"断言(x> y);"使用默认情况下关闭的JVM功能。但是,它可以为您提供更大的灵活性,因为您可以使用一个参数打开和关闭它。

方式#2" if(y> x)抛出新的AssertionError();"将永远执行,您不能通过assert-param将其关闭。这只是一个例外。

我经常看到人们使用Exceptions" real"错误(网络不可用,提供错误输入),而在开发/集成期间经常使用(即打开)断言以进行非常基本的检查(例如,参数不是null)。 IMO,很难画线。

答案 2 :(得分:0)

当assert(x> y)失败时,它会引发AssertionError(提供的断言被启用)。使用java断言的优点是可以在编译期间启用或禁用它。与手动引发AssertionError相比,您可以禁用生产环境的断言,从而提高性能,在AssertionError中始终执行断言,从而降低性能。

答案 3 :(得分:0)

以上答案中没有一个回答我的第二个问题(哪一个被认为是一个很好的编程实践?)。所以我跟我的朋友和他说过这个问题,如果有些东西是私有的,你是唯一一个调用该函数的人(例如私有函数),那么就使用assert。如果某些内容是公开的,并且您希望其他第三方开发人员可以直接调用该函数,那么请执行显式检查并抛出异常。