1. ホーム
  2. java

[解決済み] スレッド "main" での例外 java.lang.ExceptionInitializerError Caused by: java.lang.NullPointerException

2022-02-03 16:11:06

質問

ポートを設定するためにconfig.propertiesファイルを使用しています。実行後、エラーになります。

スレッドで例外発生 "main" java.lang.ExceptionInInitializerError

原因:java.lang.NullPointerException at

java.util.Properties$LineReader.readLine(Properties.java:434) at

java.util.Properties.load0(Properties.java:353) at

java.util.Properties.load(Properties.java:341) at

HttpServer.setPort(HttpServer.java:83) at

HttpServer.(HttpServer.java:26)

メインクラスです。

public class HttpServer {

    static final boolean SSL = System.getProperty("ssl") != null;
    static final int PORT = Integer.parseInt(System.getProperty("port", SSL ? "8443" : setPort()));

    public static void main(String[] args) {
        HttpServer httpServer = new HttpServer();
        httpServer.start();
    }

    public void start(){}

    public static String setPort() {
        String port = "";
        Properties properties = new Properties();
        try {
            properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("src/main/config.properties"));
            port = properties.getProperty("server.port");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return port;
    }
}

何がエラーなのか理解できませんが...。

どうすればいいですか?

あなたのコードは、mavenプロジェクトにあるようです。このように

  1. プロパティファイルを src/main/resources/config.properties
  2. 使用 getResourceAsStream("/config.properties")

mavenでビルドする場合、mavenはあなたのjarをパッケージ化し、リソースをクラスパスの一部にします。このとき resources/ を使うときはスラッシュで始めるので、クラスパスのルートの一部になります。 getResourceAsStream .

また、単純に呼び出すこともできたはずです。 HttpServer.class.getResourceAsStream("/config.properties") の代わりに

InputStreamをオープンし、それを Properties.load() . これでは、ストリームが開いたままになってしまいます。のようにするのがベターです。

try (InputStream is = HttpServer.class.getResourceAsStream("/config.properties") ) {
  properties.load(is);
}

Try-With-Resourcesは、何があっても(エラーや例外が発生しても)入力ストリームを閉じるように配慮しています。

多くの人はそうしないし、私だって短時間のプログラムなら開いたままにしている.しかし、あなたの場合は、それがHTTPサーバーであることを示唆している...したがって、これらのマットについてより敏感である方が良い...接続リーク、ファイルハンドルリーク、メモリリークなど。最終的にはガベージコレクションされるかもしれないが、それに依存しない方が良い。