Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理空指针异常的最佳模式_Java_Android_Nullpointerexception_Gson - Fatal编程技术网

Java 处理空指针异常的最佳模式

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 我有一个非

我正在寻找处理NPE(空指针异常)的最佳模式。 我正在对web api调用进行改型,但有时可能会出现某些字段为null的情况,或者也可能出现null数组的情况。 我要找的是,有没有办法一次处理完所有的事情

例如

模型类

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(“无效名称”)

使用Gson库来反序列化json文件,它通过调用serializeNulls来处理null项本身

这是一个很好的Gson库指南(由google提供):

首先,您应该使用
封装
。这意味着变量应该是
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>();
     }
}