トラブルシューティング
この記事は、chapter3を始めるにあたり画面の起動でエラーが出てしまった時のメモとして記載します。
エラーになった原因(自分のケース) Cause getting Error in Chapter3
出力したエラーログ
java.lang.NullPointerException: source
at java.util.Objects.requireNonNull(Objects.java:228)
at java.util.Scanner.(Scanner.java:578)
at zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter4.engine.Utils.loadResource(Utils.java:11)
at zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter4.game.Renderer.init(Renderer.java:26)
at zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter4.game.DummyGame.init(DummyGame.java:22)
at zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter4.engine.GameEngine.init(GameEngine.java:50)
at zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter4.engine.GameEngine.run(GameEngine.java:38)
at java.lang.Thread.run(Thread.java:748)
at zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter4.engine.GameEngine.start(GameEngine.java:29)
at zenryokuservice.gui.lwjgl.tutoriral.gitbook.chapter4.game.Main.main(Main.java:13)
上の様なエラーログが出力された場合です。これは上の赤字の部分から追いかけると原因がわかります。
対象のコード(赤い字)
public static String loadResource(String fileName) throws Exception {
String result;
try (InputStream in = Class.forName(Utils.class.getName()).getResourceAsStream(fileName);
Scanner scanner = new Scanner(in, "UTF-8")) {
result = scanner.useDelimiter("\\A").next();
}
return result;
}
上記の赤い部分がエラーの出ている行になります。コードを追いかけてみると「in」をScannerで読み取るための準備(Scannerをインスタンス化)をしているところでエラーが起きていますので、「in」「"UTF-8"」が怪しいと睨みます。「"UTF-8」は固定値(定数)なので犯人ではなさそうです。
次に、「in」を追跡します。「in」はInputStream=>ClassクラスのメソッドgetResourceAsStreamを呼び出しているのでそいつを調べます。
引数にある「リソース(ファイル)」を取得するメソッドですので返却する値はInputStreamです。
※ここら辺について記載した記事はこちらです。
- 標準入力(System.in=>InputStream)について
- 標準入力、ファイル入力などの読み込み
- 最近ではScannerを使用する様ですが、リンク先を理解してしまえばScannerはすぐに理解できます。「古い→技術的な基盤になっている」と言うことです。
- ファイル操作について
- クラスについて(基本)