Java 检查NullPointerException、正确性或个人信念?
在我的代码中,我对null进行了大量检查,这样我就不会得到NullPointerException通常我只是这样做:Java 检查NullPointerException、正确性或个人信念?,java,Java,在我的代码中,我对null进行了大量检查,这样我就不会得到NullPointerException通常我只是这样做: if(variable != null){ //do something with the variable } 以下是更好的方式,还是只是一个问题或个人信仰 if( !variable.equals(null) ){ //do something with the variable } 有没有更有效的方法来进行检查 顺便说一句,我已经做了我的研究,但我似乎找
if(variable != null){
//do something with the variable
}
以下是更好的方式,还是只是一个问题或个人信仰
if( !variable.equals(null) ){
//do something with the variable
}
有没有更有效的方法来进行检查
顺便说一句,我已经做了我的研究,但我似乎找不到具体的证据来证明这两点
这不是重复的,最好的答案是你要么使用Assert,它不能用来运行代码,而只是显示一条消息,要么实际抛出我也不想要的异常。这篇文章是针对同一主题的不同问题
if(!variable.equals(null) ){
//do something with the variable
}
若变量为空,则发生NPE。第一种方法要好得多
编辑:
使用可选选项:
考虑一下你有人对象,想要得到薪水。不幸的是,年龄可以为空-在这种情况下,您需要默认值。您可以执行整数salary=Optional.ofNullableperson.getSalary.orElse2000。如果工资为空,它将从person或2000返回salarty
若变量为空,则发生NPE。第一种方法要好得多
编辑:
使用可选选项:
考虑一下你有人对象,想要得到薪水。不幸的是,年龄可以为空-在这种情况下,您需要默认值。您可以执行整数salary=Optional.ofNullableperson.getSalary.orElse2000。如果工资为空,它将从person或2000返回salarty。有两种方法:
public void calculate(Class variable) {
Assert.notNull(variable, "variable was null");
//calculations
}
//and
if (variable == null) {
//bad
} else {
calculate(variable);
}
第二种是最常见的。如果变量是字符串,则考虑使用Guava. String UTILSL,使用它的String ISBLIN方法,检查字符串为null还是
总结:
if (variable == null) {
//bad
} else {
//good
}
以上是标准方法。更好的办法是:
private boolean isNull(Class variable) {
return variable == null;
}
if (isNull(variable)) {
} else {
}
有两种方法:
public void calculate(Class variable) {
Assert.notNull(variable, "variable was null");
//calculations
}
//and
if (variable == null) {
//bad
} else {
calculate(variable);
}
第二种是最常见的。如果变量是字符串,则考虑使用Guava. String UTILSL,使用它的String ISBLIN方法,检查字符串为null还是
总结:
if (variable == null) {
//bad
} else {
//good
}
以上是标准方法。更好的办法是:
private boolean isNull(Class variable) {
return variable == null;
}
if (isNull(variable)) {
} else {
}
我过去总是调用下面的方法来检查nullpointer异常
public static boolean isAvailable(Object data) {
return ((data!=null) && (data.toString().trim().length() > 0));
}
我过去总是调用下面的方法来检查nullpointer异常
public static boolean isAvailable(Object data) {
return ((data!=null) && (data.toString().trim().length() > 0));
}
正如其他人已经说过的,变体
if(!variable.equals(null))
当变量为null时,可以对NPE本身进行修改。此外,您必须确保equals方法对于您使用的所有对象类型也是空安全的。因此,如果您确实需要检查,请使用==
至于更好的解决方案,我们将基于这里的观点:我认为这种接受的空检查是脆弱软件和次优接口定义的标志。我目前越来越多地尝试使用javax.validation注释@NotNull来强化我的接口,并摆脱所有这些运行时检查:
private @NotNull String getName() {...} // guaranteed not to return null
...
if(getName() == null) { // superfluos, your IDE gives a shout if configurd correctly
...
}
。。。试一试:
编辑作为注释的答案,因为我需要代码格式:
下面是我当前eclipse设置中的完整剪切粘贴示例:
package stuff;
import javax.validation.constraints.NotNull;
public class Try3 {
public @NotNull String getName() { return ""; }
public void test() {
if(getName() == null)
System.out.println("Cannot happen due to contract");
}
}
确保导入的类型确实是javax.validation.constraints.NotNull,因为其他框架也有NotNull注释,可以用不同的方式定义。对于eclipse,还必须在JavaCompiler/Errors/Warnings下的项目设置中选中Enable annotation-based null analysis,并自定义要使用的注释,因为eclipse默认为一些自制的注释。在同一设置页面中选中“使用默认注释”复选框后,可以通过链接“配置”访问自定义。希望有帮助 正如其他人已经说过的,变体
if(!variable.equals(null))
当变量为null时,可以对NPE本身进行修改。此外,您必须确保equals方法对于您使用的所有对象类型也是空安全的。因此,如果您确实需要检查,请使用==
至于更好的解决方案,我们将基于这里的观点:我认为这种接受的空检查是脆弱软件和次优接口定义的标志。我目前越来越多地尝试使用javax.validation注释@NotNull来强化我的接口,并摆脱所有这些运行时检查:
private @NotNull String getName() {...} // guaranteed not to return null
...
if(getName() == null) { // superfluos, your IDE gives a shout if configurd correctly
...
}
。。。试一试:
编辑作为注释的答案,因为我需要代码格式:
下面是我当前eclipse设置中的完整剪切粘贴示例:
package stuff;
import javax.validation.constraints.NotNull;
public class Try3 {
public @NotNull String getName() { return ""; }
public void test() {
if(getName() == null)
System.out.println("Cannot happen due to contract");
}
}
确保导入的类型确实是javax.validation.constraints.NotNull,因为其他框架也有NotNull注释,可以用不同的方式定义。对于eclipse,还必须在JavaCompiler/Errors/Warnings下的项目设置中选中Enable annotation-based null analysis,并自定义要使用的注释,因为eclipse默认为一些自制的注释。在同一设置页面中选中“使用默认注释”复选框后,可以通过链接“配置”访问自定义。希望有帮助 或者您可以使用Java 8
非常好的例子都在上面
可选通常用于lambdas中的功能性操作。或者您可以使用Java8
非常好的例子都在上面可选选项通常用于lambdas中的功能性操作。第二个选项可能会更好吗?当变量为时,它将抛出NullPointerExceptionnull@cricket_007这是真的,但我的目的是,表明我打算使用。等式我认为这里的实际解决方案可能取决于您在找到null或不找到null时希望如何处理该值。例如,我总是喜欢正确而不是个人信念。特别是其他人的个人信仰。第二种信仰的可能复制品如何更好?当变量为时,它将抛出NullPointerExceptionnull@cricket_007这是真的,但我的目的是,表明我打算使用。等式我认为这里的实际解决方案可能取决于您在找到null或不找到null时希望如何处理该值。例如,我总是喜欢正确而不是个人信念。特别是其他人的个人信仰。谢谢你的回答,但是有没有比第一个更好的方法呢?同意-你应该使用这个ifvariable!=空{}没有更好的方法来检查某个内容是否为空。基于您的需要,您可以考虑使用Java8中的可选选项,或者只是尝试在代码中不传递空值。@拜拜,我尽量不这样做,但您永远不知道^ ^是否可以提供一个您提到的可选的示例?不幸的是,年龄可以为空-在这种情况下,您需要默认值。您可以执行整数salary=Optional.ofNullableperson.getSalary.orElse2000。如果薪资为空,它将从person或2000返回salarty。感谢您的回答,但是是否有比第一个更好的方法来执行此操作?同意-您应该使用此ifvariable!=空{}没有更好的方法来检查某个内容是否为空。基于您的需要,您可以考虑使用Java8中的可选选项,或者只是尝试在代码中不传递空值。@拜拜,我尽量不这样做,但您永远不知道^ ^是否可以提供一个您提到的可选的示例?不幸的是,年龄可以为空-在这种情况下,您需要默认值。您可以执行整数salary=Optional.ofNullableperson.getSalary.orElse2000。如果工资为空,它将从person或2000返回salarty。可以使用断言返回salarty。我的意思是运行一些代码,但不显示消息?当变量为null时,它只会抛出异常,当变量为null时,它会抛出异常。所以它不能在条件if-else中使用statements@hedgehog检查我的更新。一个用于使变量绝对不会为空。另一个应在假定notNull的计算之前使用。可以使用带有Assert的一个。我的意思是运行一些代码,但不显示消息?当变量为null时,它只会抛出异常,当变量为null时,它会抛出异常。所以它不能在条件if-else中使用statements@hedgehog检查我的更新。一个用于使变量绝对不会为空。另一个应该在假设notNull.hmmm可能的答案的计算之前使用,但我认为它没有效率,因为如果您需要其他您无法配置的情况控制。。。。谢谢你的回答,但我认为这不是很有效,因为如果你需要其他你无法配置的情况控制。。。。谢谢,虽然我确实尝试了您推荐的方法,但是当尝试将@NotNull添加到方法中时,我得到了一个警告,该位置不允许使用@NotNull注释。。。。。我的方法和你的一样,private@NotNull String getStr{return;}出于某种原因,我不断出错,IDE也不断要求用@com.esotericsoftware.kryo.NotNull更改导入如果它是maven项目,则添加依赖项javax.validation.validation-api 1.1.0.Final-否则,检查您从何处获得该库。我确实尝试了您建议的方法,但在尝试将@NotNull添加到方法时,我得到了一个错误消息,即该位置不允许使用批注@NotNull。。。。。我的方法和你的一样,private@NotNull String getStr{return;}出于某种原因,我不断出错,IDE也不断要求用@com.esotericsoftware.kryo.NotNull更改导入如果它是maven项目,则添加依赖项javax.validation.validation-api 1.1.0.Final-否则,检查你从哪里得到那个图书馆。