Java 处理空指针异常的最佳模式
我正在寻找处理NPE(空指针异常)的最佳模式。 我正在对web api调用进行改型,但有时可能会出现某些字段为null的情况,或者也可能出现null数组的情况。 我要找的是,有没有办法一次处理完所有的事情 例如 模型类Java 处理空指针异常的最佳模式,java,android,nullpointerexception,gson,Java,Android,Nullpointerexception,Gson,我正在寻找处理NPE(空指针异常)的最佳模式。 我正在对web api调用进行改型,但有时可能会出现某些字段为null的情况,或者也可能出现null数组的情况。 我要找的是,有没有办法一次处理完所有的事情 例如 模型类 public class ModelClass{ String name; String email; List<Items> items; } 因此,在反序列化json文件后,当我尝试将文本设置为文本视图时,它将通过NPE 我有一个非
public class ModelClass{
String name;
String email;
List<Items> items;
}
因此,在反序列化json文件后,当我尝试将文本设置为文本视图时,它将通过NPE
我有一个非常大的模型类集合,实际上,在使用它时将每个字段放入try{}catch()是错误的。
有没有更好的方法来处理这种情况?我会用一个。这将迫使您在编译时决定如果值为null该怎么做
Optional<String> optionalName = Optional.ofNullable(person.getName());
optionalName=Optional.ofNullable(person.getName());
然后,您可以决定,例如:
public class Item{
private String field;
public Item(){
field = "hello";
}
}
public class Items{
private List<Item> items;
public Items(){
items = new List<Item>();
}
}
- 指定默认值:
String name=optionalName.orElse(“Bob”)代码>
- 抛出您选择的异常:
String name=optionalName.orelsethorn(()->new IllegalArgumentException(“无效名称”)代码>
首先,您应该使用
封装
。这意味着变量应该是private/protected
,并且具有公共getter
和setter
像这样:
public class ModelClass{
private String name;
private String email;
private List<Items> items;
public ModelClass(){
items = new List<Items>();
}
public String getName(){
return name != null?name:"";
}
public void setName(String name){
this.name = name;
}
public String getEmail(){
return email=null?email:"";
}
public void setEmail(String email){
this.email= email;
}
public Items getItem(int index){
return items!=null?items.get(index):null;
}
public boolean addItem(Items item){
return items!=null?items.add(item):false;
}
}
最后,我还建议您看看
字符串方法:。正如您所看到的,该方法检查传递的变量是否为null
,并仅在不为null时返回字符串值。您可以使用类似的方法。如果您只是想避免NPE,因为您觉得烦人,您可以在自己反序列化json文件时初始化值。例如,如果反序列化的名称为null,则只需像这样初始化name=“”。这样,您不必接触所有模型类,只需修改反序列化方法即可。这可以预防NPE 我不建议你在一个地方这样做。最好的方法是在使用该字段之前检查null,否则像gson这样的libs会为您执行此操作。而且,将所有空字符串替换为“”是不高效和优雅的,因为json字符串可能具有较深的层次结构。因此,如果@myoldGrandge的答案可行,如果您坚持这样做,也许这是最好的方法。它应该返回null,而不是抛出异常。您不处理NullPointerException。你抓不到他们。你避开他们。如果引用可以为null,则在调用该引用的方法之前检查null。基本上,object.getName()会在此处返回null。。。我想做的不是空,而是将它们转换为空字符串,或者将空数组列表转换为空arraylist。。。你认为这是一个好方法吗?@Techierj如果你在构造函数90%
中初始化每一个对象,那么即使没有检查,你也不会有问题。(另外10个是当您使用在初始化期间可能引发异常的对象时,例如文件
,连接
等)。但是每个Java
项目都应该对所有非静态字段使用getter
和setter
。Hi可选将对android有所帮助。谢谢你的回复,尽管我不知道谁投了反对票:(嗨,payam,,,我已经看过这篇文章了..但是检查电子邮件字段值它仍然是空的…因为字符串的默认值为空。所以这对我管理NPenoE没有帮助,因为当我们在GSon
中允许null
时,它允许使用默认值,字符串的默认值为空,所以它希望在这里工作。。我可以在android上使用它吗?我想现在android中只有java 8
的一些功能可用试试看!如果没有,API足够简单,你可以设计自己的实现。谢谢,android中的API级别24
支持它。
public class Item{
private String field;
public Item(){
field = "hello";
}
}
public class Items{
private List<Item> items;
public Items(){
items = new List<Item>();
}
}