我怎么能从一个空的json文件中读取,在程序开始时它是空的,但后来可以写出来

How could I read from an empty json File,at the start of the program is it empty but later can be written

提问人:ERFAKLK 提问时间:12/9/2022 更新时间:12/9/2022 访问量:299

问:

读取文件是:

public ArrayList<Aventura> readFile(){
    ArrayList<Aventura> aventures = new ArrayList<>();
    try{
        AventuraDAO aventuraDAO=new AventuraDAO();
        AventuraManage aventuraManage=new AventuraManage(aventuraDAO);
        Gson g=new Gson();
        JsonReader reader=new JsonReader(new FileReader("Files/adventures.json"));
        Aventura[] ave=g.fromJson(reader, Aventura[].class );

        if (ave.length==0){
            System.out.println("The file should be empty");
            ArrayList<Aventura> aventures2 =null;
            return aventures2;
        }
        
        for (int i = 0; i < ave.length; i++) {
            aventures.add(ave[i]);
        }
    }
    catch(FileNotFoundException e){
        System.out.println("The file does not exists");
    }
    catch (IOException e){
        ArrayList<Aventura> aventures2 =null;

        System.out.println(e.getMessage());
        e.printStackTrace();

    }
    return aventures;

我想知道要读取的对象是否具有 length==0,但这不是我想的方式。然后我会返回一个空数组列表,以便将来进行一些验证。

我有:

Exception in thread "main" java.lang.NullPointerException: Cannot read the array length because "ave" is null
    at Persistence.AventuraDAO.readFile(AventuraDAO.java:25)
    at Business.AventuraManage.lookMonstersCombatActual(AventuraManage.java:48)
    at Presentation.Controller.createAdvenutre(Controller.java:198)
    at Presentation.Controller.executeOption(Controller.java:47)
    at Presentation.Controller.run(Controller.java:30)
    at Main.main(Main.java:21)
java json nullpointerexception gson readfile

评论


答:

1赞 Max Alexander Hanna 12/9/2022 #1

尝试分隔成不同的值,例如

fileR = new FileReader("Files/adventures.json")
if fileR.length = 0 {return}
else
jsonR = new JsonReader(fileR)
1赞 computercarguy 12/9/2022 #2

您的异常指向变量“ave”是 ,因此请对其进行 null 检查以处理它。nullnull

这可以像以下几点一样简单:

if (ave == null || ave.length==0){

由于循环假定 “ave” 变量中有值,因此应将其置于条件中。这样一来,上面的语句就是处理“ave”存在的唯一需要做的。forelseifnull

如果你真的想从这个方法返回一个,那么在你的当前语句之前,将它自己的空检查分开,并在其中返回一个值,因为你的默认返回值是一个空数组。但是,这也意味着您必须确保返回数据类型可为 null,并在使用返回值的代码中处理 null。这并不难,只是你必须牢记并记住要处理的事情。nullifnull

if (ave == null){
  return null;
}