我试图创建一个使用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; 并不总是显示出来。
答案 0 :(得分:2)
阅读评论,似乎有一个错字引起了错误。但是,我仍然会解决时间问题。
明显的时序不匹配是由于输出流的工作方式:异常堆栈跟踪打印到System.err
,但您将错误消息打印到System.out
。当您的IDE显示程序输出时,有时一个流比另一个流慢一点,并且订单搞砸了。
要解决此问题,请尝试通过System.err
打印所有错误消息。在单个流中,消息永远不会像这样重新排序。