在前一个Java函数结束之前执行的Java函数

时间:2016-06-17 18:03:51

标签: java nullpointerexception

我试图创建一个使用gson加载的自定义对象的ArrayList,以便稍后从中获取信息,但似乎Java在第一个返回任何内容之前执行其他函数并且它导致了的NullPointerException。

似乎总是在第一个对象加载了gson之后发生。

主要课程:

cellTemplate

Utils类:

package com.azias.awbe.tests;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import com.azias.awbe.Utils;
import com.azias.awbe.mod.ModInfo;
import com.azias.awbe.mod.ModLoader;
import com.google.gson.Gson;

public class ModLoadingTest {

    public static void main(String[] args) {
        ArrayList<ModInfo> availableMods = loadModsList();

        String[] modIds = args[0].split(";");
        ModInfo[] modsToLoad = new ModInfo[modIds.length];

        for(int i=0; i<modIds.length; i++) {
            for(ModInfo mod : availableMods) {
                if(mod.getId().equals(modIds[i])) {  //This is the line 26.
                    modsToLoad[i] = mod;
                }
            }
        }

        ModLoader modLoader = new ModLoader(modsToLoad);

        modLoader.loadModCode();
    }

    public static ArrayList<ModInfo> loadModsList() {
        ArrayList<ModInfo> mods = new ArrayList<ModInfo>();
        ArrayList<File> folders = Utils.listFolders("./assets");

        for(File folder: folders) {
            File modInfoFile = new File(folder.getAbsolutePath()+"/modinfo.json");
            if(modInfoFile.isFile()) {
                try {
                    String json = Utils.fileToString(modInfoFile.getAbsolutePath());
                    ModInfo mod = new Gson().fromJson(json, ModInfo.class);
                    mods.add(mod);
                } catch (IOException e) {
                    System.err.println("Unable to load the \"modInfo.json\" file in \""+folder.getName()+"\"");
                    e.printStackTrace();
                }
            } else {
                System.out.println("The folder named \""+folder.getName()+"\" does not countain a modinfo.json file.");
            }
        }

        return mods;
    }
}

控制台日志:

package com.azias.awbe;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class Utils {

    /**
     * List all the folder under a directory
     * @param directoryName to be listed
     */
    public static ArrayList<File> listFolders(String directoryName) {
        ArrayList<File> files = new ArrayList<File>();
        File directory = new File(directoryName);
        File[] fList = directory.listFiles();
        for(File file : fList) {
            if (file.isDirectory()) {
                files.add(file);
            }
        }
        return files;
    }

    public static String fileToString(String path) throws IOException  {
        return new String(Files.readAllBytes(Paths.get(path)), StandardCharsets.UTF_8);
    }
}

线程中的异常&#34; main&#34; 并不总是显示出来。

1 个答案:

答案 0 :(得分:2)

阅读评论,似乎有一个错字引起了错误。但是,我仍然会解决时间问题。

明显的时序不匹配是由于输出流的工作方式:异常堆栈跟踪打印到System.err,但您将错误消息打印到System.out。当您的IDE显示程序输出时,有时一个流比另一个流慢一点,并且订单搞砸了。

要解决此问题,请尝试通过System.err打印所有错误消息。在单个流中,消息永远不会像这样重新排序。