2016-06-17 17 views
0

gsonでロードされたカスタムオブジェクトのArrayListを作成して、後でその情報を取得しようとしていますが、Javaが他の関数を実行していて、 NullPointerExceptionが発生します。前のコードが終了する前に実行されるJava関数

最初のオブジェクトにgsonが読み込まれた後は、常に起こっているようです。

メインクラス:

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; 
    } 
} 

Utilsのクラス:

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); 
    } 
} 

コンソールログ:スレッドで

The folder named "customMaps" does not countain a modinfo.json file. 
Exception in thread "main" 
The folder named "launcher" does not countain a modinfo.json file. 
The folder named "modtest" does not countain a modinfo.json file. 
java.lang.NullPointerException at com.azias.awbe.tests.ModLoadingTest.main(ModLoadingTest.java:26) 

例外 "メイン"が常に表示されません。

+0

リバースエンジニアリングを行います。mod.getId()がnullであるか、modIds [i]がnullであるかどうかを確認してチェックします。そうすれば、どこに問題があるのか​​を簡単に知ることができます – sathya

+0

あなたのmodinfo.jsonファイルはどこにありますか? – PVR

+1

"modinfo.json"ファイルにタイプミスがあったため、gsonは "id"フィールドをロードしなかったという問題が見つかりました。 – Azias

答えて

2

コメントを読むと、エラーの原因となったタイプミスがありました。しかし、私はまだタイミングの問題に対処します。


見かけのタイミングの不一致があるため、出力ストリームが作業方法は次のとおりです。例外のスタックトレースがSystem.errに印刷されていますが、System.outにエラーメッセージを印刷しています。あなたのIDEがプログラムの出力を表示するときに、あるストリームが別のストリームより少し遅いことがあり、その順序が乱れてしまうことがあります。

この問題を解決するには、すべてエラーメッセージをSystem.errまで印刷してみてください。単一のストリーム内では、このようにメッセージは並べ替えられません。

関連する問題