Указатель NULL в пути класса InputStreamReader

Привет, к сожалению, я просто не понимаю, почему я получаю нулевой указатель:

Мой класс ResourceLoader

public static String loadResource(String path){
       StringBuilder result = new StringBuilder();
       try {
           InputStreamReader isr = new InputStreamReader(Class.class.getResourceAsStream(path)) ;
           BufferedReader reader = new BufferedReader(isr);
           String line = "";
           while((line = reader.readLine()) != null){
                result.append(line).append("\n");
           }
       }catch (IOException e){
           System.out.println("File nicht gefunden:  " + e);
       }
    return result.toString();
    }

Вот где я его использую

shaderProgram.createVertexShader(ResourceLoader.loadResource("shaders/mainVertex.glsl"));
shaderProgram.createFragmentShader(ResourceLoader.loadResource("shaders/mainFragment.glsl"));

Это исключение, которое я получаю

java.lang.NullPointerException
    at java.base/java.io.Reader.<init>(Reader.java:167)
    at java.base/java.io.InputStreamReader.<init>(InputStreamReader.java:72)
    at utils.ResourceLoader.loadResource(ResourceLoader.java:13)
    at graphics.Renderer.init(Renderer.java:32)
    at GameEngine.init(GameEngine.java:43)
    at GameEngine.run(GameEngine.java:33)
    at Main.main(Main.java:9)

Process finished with exit code 0

Спасибо, что посмотрели!


person JaEmiX    schedule 24.05.2020    source источник
comment
Судя по трассировке стека исключений, Class.class.getResourceAsStream(path) возвращает значение null.   -  person NomadMaker    schedule 24.05.2020
comment
Этот вопрос кажется дубликатом NPE из класса getResource   -  person Alex Rudenko    schedule 24.05.2020


Ответы (1)


Как указал NomadMaker, проблема заключается в вызове

new InputStreamReader(Class.class.getResourceAsStream(path))

возвращает нулевое значение (вы могли бы увидеть это как часть сообщения об ошибке).

Это должно сработать для вас:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Objects;

public class Main {

    public static void main(String[] args) {
        String filepath = "test.txt";
        System.out.println(loadResource(filepath));
    }

    public static String loadResource(String path) {
        InputStream is = Main.class.getClassLoader().getResourceAsStream(path);
        StringBuilder result = new StringBuilder();
        try (InputStreamReader isr = new InputStreamReader(Objects.requireNonNull(is));
             BufferedReader reader = new BufferedReader(isr)) {
            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line).append("\n");
            }
        } catch (IOException | NullPointerException e) {
            System.out.println("File nicht gefunden:  " + e);
        }
        return result.toString();
    }
}

Вопросы, о которых следует помнить:

  1. Вам нужно закрыть InputStreamReader и BufferedReader, когда вы закончите с ними. Здесь я использовал попытку с ресурсами (см. официальную документацию если это для вас в новинку).

  2. Этот код предполагает, что вы сохранили файл, который вы читаете, внутри папки ресурсов. Если файл не может быть найден, будет выдана ошибка NPE, которую я включаю в улов. Вы можете поступить с исключением по-другому.

  3. Этот код также предполагает, что вы работаете в статическом контексте. Если нет, используйте вместо него this.class.getClass()getClassLoader().getResourceAsStream(path).

person cadebe    schedule 24.05.2020