我用object != null
了很多东西来避免NullPointerException
.
有没有一个很好的替代品呢?
例如:
if (someobject != null) {
someobject.doCalc();
}
Run Code Online (Sandbox Code Playgroud)
NullPointerException
当不知道对象是否存在时,这避免了a null
.
请注意,接受的答案可能已过期,请参阅/sf/answers/167020941/以获取更新的方法.
会null instanceof SomeClass
退还false
还是扔NullPointerException
?
我希望使我的代码更具可读性,并使用IDE代码检查和/或静态代码分析(FindBugs和Sonar)等工具来避免NullPointerExceptions.许多工具似乎与彼此的@NotNull
/ @NonNull
/ @Nonnull
注释不兼容,并列出我的代码中的所有这些工具都很难阅读.有什么建议是"最好的"吗?这是我发现的等效注释列表:
javax.validation.constraints.NotNull
创建用于运行时验证,而不是静态分析.
文件
edu.umd.cs.findbugs.annotations.NonNull
由Findbugs静态分析使用,因此Sonar(现为Sonarqube)
文档
javax.annotation.Nonnull
这可能也适用于Findbugs,但JSR-305处于非活动状态.(另请参阅:JSR 305的状态是什么?)
来源
org.jetbrains.annotations.NotNull
由IntelliJ IDEA IDE用于静态分析.
文件
lombok.NonNull
用于控制Project Lombok中的代码生成.
占位符注释,因为没有标准.
来源,
文档
android.support.annotation.NonNull
Android中提供的标记注释,由support-annotations包
文档提供
org.eclipse.jdt.annotation.NonNull
Eclipse用于静态代码分析
文档
注意:这是针对常见问题的规范答案.
我有一个Spring @Service
class(MileageFeeCalculator
),它有一个@Autowired
field(rateService
),但该字段是null
我尝试使用它时.日志显示正在创建MileageFeeCalculator
bean和MileageRateService
bean,但NullPointerException
每当我尝试mileageCharge
在我的服务bean上调用该方法时,我都会得到.为什么Spring没有自动装配领域?
控制器类:
@Controller
public class MileageFeeController {
@RequestMapping("/mileage/{miles}")
@ResponseBody
public float mileageFee(@PathVariable int miles) {
MileageFeeCalculator calc = new MileageFeeCalculator();
return calc.mileageCharge(miles);
}
}
Run Code Online (Sandbox Code Playgroud)
服务类:
@Service
public class MileageFeeCalculator {
@Autowired
private MileageRateService rateService; // <--- should be autowired, is null
public float mileageCharge(final int miles) {
return (miles * rateService.ratePerMile()); // <--- throws NPE
}
}
Run Code Online (Sandbox Code Playgroud)
应该自动装配的服务bean,MileageFeeCalculator
但它不是:
@Service …
Run Code Online (Sandbox Code Playgroud) 我有一个简单的属性的setter方法,null
不适合这个特定的属性.我总是在这种情况下被撕裂:我应该扔一个IllegalArgumentException
,还是一个NullPointerException
?从javadocs看,两者似乎都合适.有某种理解标准吗?或者这只是你应该做的任何事情之一,而且两者都是正确的?
java null exception nullpointerexception illegalargumentexception
我有我们的Java代码的实例捕获NullPointerException
,但当我尝试记录StackTrace(基本上最终调用Throwable.printStackTrace()
)时,我得到的是:
java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)
还有其他人遇到过这个吗?我试过谷歌搜索"java空指针空堆栈跟踪",但没有遇到这样的事情.
运行时:
public class WhatTheShoot {
public static void main(String args[]){
try {
throw null;
} catch (Exception e){
System.out.println(e instanceof NullPointerException);
System.out.println(e instanceof FileNotFoundException);
}
}
}
Run Code Online (Sandbox Code Playgroud)
回应是:
true
false
Run Code Online (Sandbox Code Playgroud)
这对我来说相当惊人.我原本以为这会造成编译时错误.
为什么我可以在Java中抛出null,为什么要将它转换为NullPointerException呢?
(实际上,我不知道它是否是"向上",因为我扔的是null)
除了一个非常愚蠢的面试问题(请不要在面试中问这个)我看不出任何理由throw null
.也许你想被解雇,但那是......我的意思是,为什么还有人throw null
呢?
有趣的事实 IntelliJ IDEA 12告诉我,我的行e instanceof NullPointerException
总是假的.这根本不是真的.
如果其中一个值为'null' ,Java 8 Collectors.toMap
将抛出一个NullPointerException
.我不明白这种行为,map可以包含null指针作为值而没有任何问题.有没有一个很好的理由为什么值不能为空Collectors.toMap
?
另外,是否有一个很好的Java 8方法来修复它,或者我应该恢复到普通的旧循环?
我的问题的一个例子:
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class Answer {
private int id;
private Boolean answer;
Answer() {
}
Answer(int id, Boolean answer) {
this.id = id;
this.answer = answer;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Boolean getAnswer() {
return answer;
}
public void setAnswer(Boolean answer) {
this.answer = answer;
}
}
public class Main …
Run Code Online (Sandbox Code Playgroud) 当程序员抱怨空错误/异常时,有人经常会问我们做什么而没有null.
我对选项类型的酷感有一些基本的想法,但我没有最好的表达它的知识或语言技巧.对于普通程序员可以接近的方式写的以下内容有什么好的解释,我们可以指出那个人?
null programming-languages functional-programming nullpointerexception non-nullable
什么是空指针异常(java.lang.NullPointerException
)以及它们的原因是什么?
可以使用哪些方法/工具来确定原因,以便停止异常导致程序过早终止?
java ×9
null ×6
annotations ×1
autowired ×1
collectors ×1
exception ×1
ide ×1
java-8 ×1
java-stream ×1
non-nullable ×1
object ×1
spring ×1