等待空指针异常发生会更好吗?
public void doSomething(String str) {
Double val = Double.parseDouble(str); // Null pointer exception thrown here
// Other code
}
或者,每次检查它是否更好,尽可能早?
public void doSomething(String str) {
if (str == null)
throw new NullPointerException(); // Null pointer exception thrown here
Double val = Double.parseDouble(str); // Other code
}
答案 0 :(得分:1)
我建议使用assert子句。我认为他的回答最能回答你的问题
答案 1 :(得分:1)
我会在你的方法中指出str是否可以为null @Nullable
关键字。如果您不允许str变量为null,则不要进行任何空检查。你应该在调用doSomething之前检查str是否为null 。如果允许str为null,则将其包装在null检查中,如果变量为null,则执行您认为合适的任何操作。
public void doSomething(@Nullable String str) {
if (str != null) {
Double val = Double.parseDouble(str);
// other code
}
else {
// return or do something else
}
}
或..
public void doSomething(@Nullable String str) {
if (str == null) {
return;
}
Double val = Double.parseDouble(str);
// other code
}
除非应用程序在没有str变量的情况下无法继续,否则我不建议抛出空指针错误。您希望捕获异常,以便应用程序不会崩溃,不允许它们使应用程序崩溃。
答案 2 :(得分:1)
在这种情况下,由于parseDouble
会抛出NPE,因此并没有太大的区别。在更一般的情况下,从Java 7开始,您可以使用:
Objects.requireNonNull(str); //throws NPE if str is null
//rest of the code
答案 3 :(得分:0)
没有不同的代码。你应该抛出一些特殊的例外。 有时候null是合法的价值。
答案 4 :(得分:0)
有时通常会定义类似方法合同的内容。
我是通过Spring Asserts
执行此操作的:
org.springframework.util.Assert;
Assertion实用程序类,可帮助验证参数。有用 用于在运行时尽早识别程序员错误。
例如,如果公共方法的合同声明它没有 允许null参数,Assert可用于验证该合同。 这样做可以清楚地表明合同违规发生时 保护班级的不变量。
通常用于验证方法参数而不是配置 属性,用于检查通常是程序员错误的情况 而不是配置错误。与配置初始化相反 代码,在这种情况下回归默认值通常没有意义 方法。
这个类类似于JUnit的断言库。如果是一个论点 如果value被视为无效,则抛出IllegalArgumentException (通常)。
在你的情况下:
public void doSomething(String str) {
Assert.notNull(str);
Double val = Double.parseDouble(str); // Nullpointer not possible here if the contract was not injured.
// Other code
}
如果任何开发人员传递了空值,则合同未完成并且抛出IlligalArgumentException
。
通过Junit轻松测试:
/**
* Check case that passed string is null.
*/
@Test(expected = IllegalArgumentException.class)
public void testDoSomething_StringIsNull() {
mClassUnderTest.doSomething(null);
}