Answers:
谨防!
断言在运行时被删除,除非你明确指定为“启用断言”编译代码时。Java断言不应在生产代码上使用,而应限于私有方法(请参见Exception与Assertion),因为私有方法应被开发人员所知并使用。也assert
将抛出AssertionError的延伸Error
不Exception
和通常表明你有一个非常不正常的错误(如“OutOfMemoryError异常”,这是很难恢复过来,是不是?)不期望你能够为治疗。
删除“ enable assertions”标志,并与调试器进行检查,您将看到您不会踩IllegalArgumentException throw调用...,因为此代码尚未编译(同样,删除“ ea”时)
最好将第二种构造用于公共/受保护的方法,并且如果您希望在一行代码中完成某件事,那么我至少知道一种方法。我个人使用Spring Framework的Assert
类,该类具有一些用于检查参数的方法,并在失败时抛出“ IllegalArgumentException”。基本上,您要做的是:
Assert.notNull(obj, "object was null");
...实际上将执行与您在第二个示例中编写的代码完全相同的代码。还有其他一些有用的方法,例如hasText
,hasLength
在那里。
我不喜欢编写多余的代码,所以当我将编写的行数减少2(2行> 1行)时,我感到很高兴:-)
java -ea
和以编程方式启用。@Jalayn我认为在生产代码中包含断言是完全有效的,因为它们对于在现场
java -ea
。
Objects.requreNonNull
您需要使用一个例外。使用断言将是对该功能的滥用。
未检查的异常旨在检测库用户的编程错误,而断言旨在检测您自己的逻辑中的错误。这些是单独的问题,不应混在一起。
例如,一个断言
assert myConnection.isConnected();
意思是“我知道导致该断言的每个代码路径都会确保myConnection
已连接;如果上述代码未能获得有效的连接,则应该在到达此点之前抛出异常或返回”。
另一方面,支票
if (!myConnection.isConnected()) {
throw new IllegalArgumentException("connection is not established");
}
表示“在未建立连接的情况下调用我的库是编程错误”。
如果编写的函数不允许null
使用有效的参数值,则应将@Nonnull
注释添加到签名中,并用于Objects.requireNonNull
检查参数是否为,null
并抛出NullPointerException
是否为。该@Nonnull
注释是对文档和将在某些情况下,编译时提供有用的警告。它不会阻止null
在运行时传递。
void doStuff(@Nonnull Object obj) {
Objects.requireNonNull(obj, "obj must not be null");
// do stuff...
}
更新:该@Nonnull
注释是不是Java标准库的一部分。相反,有来自第三方库的众多竞争标准(请参阅我应该使用哪个@NotNull Java注释?)。这并不意味着使用它不是一个坏主意,只是它不是标准的。
Objects.requireNonNull()
,这对我来说是新的。您知道哪里有类似的“ requireTrue()”或“ requireEqual()”方法吗?没有什么反对Spring的断言,但并不是每个人都在使用它。
Objects.requireNonNull()
用于参数验证。如果参数必须true
等于或等于某个值,则该参数是没有意义的。对于非法参数以外的其他错误情况,您应该throw
使用Exception
更准确地描述错误的。也有JUnit,Assert
但这是用于测试的。
Objects.requireTrue(x >= 0.0);
或一些散列Objects.requireEquals(hash.length == 256)
我总是喜欢将IllegalArgumentException抛出断言。
断言通常用于JUnit或其他测试工具中,以检查/断言测试结果。因此,它可能给其他开发人员以错误的印象,即您的方法是一种测试方法。
当方法传递了非法或不合适的参数时,抛出IllegalArgumentException也很有意义。这与Java开发人员遵循的“异常处理”约定更加一致。
我没有使用很多aserts,但是使用Lombock @NonNull的常用方法:https ://projectlombok.org/features/NonNull
Lombok实现:import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
this.name = person.getName();
}
}
Java版本:
import lombok.NonNull;
public class NonNullExample extends Something {
private String name;
public NonNullExample(@NonNull Person person) {
super("Hello");
if (person == null) {
throw new NullPointerException("person");
}
this.name = person.getName();
}
}
龙目岛真的是一个非常不错的图书馆,我到处都在使用
obj.hashCode()
;-)