6

To do internal logic checks, there are two ways in Java,

  1. use the assert keyword: e.g, assert(x>y);
  2. manually throw assertion error: e.g, if(y>x) throw new AssertionError();

What are the differences among above two methods( performance wise, programming flexibility, etc.? Which one is considered as a good programming practice?

4

4 回答 4

9

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

一些阅读信息:使用断言编程

于 2013-04-03T13:16:56.243 回答
1

方式#1“断言(x>y);” 使用默认关闭的 JVM 功能。但是,它为您提供了更大的灵活性,因为您可以使用一个参数随心所欲地打开和关闭它。

方式#2“if(y>x) throw new AssertionError();” 将始终执行,您不能通过 assert-param 将其关闭。这只是一个例外。

我经常看到人们使用 Exceptions 处理“真正的”错误(网络不可用,提供了错误的输入),而在开发/集成期间经常使用断言(即打开)进行非常基本的检查(例如 param not null)。IMO,很难划清界限。

于 2013-04-03T13:39:04.673 回答
0

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

于 2013-04-03T13:20:04.320 回答
0

以上答案均未回答我的第二个问题(哪一个被认为是一种好的编程习惯?)。所以我和我的一位朋友谈到了这一点,据他说,如果某些东西是包私有的,而你是唯一一个调用该函数的人(例如,私有函数),那么使用断言。如果某些内容是公开的,并且您希望其他第三方开发人员可以直接调用该函数,则执行显式 if 检查并抛出异常。

于 2013-04-17T19:57:14.127 回答