2

私はEclipse Webプロジェクトを持っています。ルート ディレクトリに deploy.properties というファイルがあり、読み取られないようです。ファイルを「ビルドパス」(jarなど)に追加する必要があるかもしれないと感じていますが、これは単なる推測です。これを実行しようとすると、ビルドパスにファイルを追加するオプションがないため、私はそれについて間違っていると思います。

89行目はこれprops.load(stream);

私のスタック トレースは次のようになります。

java.lang.NullPointerException
at java.util.Properties$LineReader.readLine(Properties.java:365)
at java.util.Properties.load(Properties.java:293)
at sempedia.dao.Dao.getConfigFile(Dao.java:89)
at sempedia.dao.Dao.<clinit>(Dao.java:17) 89 

クラスは次のようになります。

public class Dao {
private static final String configFileLocation = "/deploy.properties";

private static final Properties configFile = getConfigFile(configFileLocation);

private static final String host = configFile.getProperty("mysql.host");
private static final String port = configFile.getProperty("mysql.port");
private static final String db   = configFile.getProperty("mysql.db");
private static final String user = configFile.getProperty("mysql.user");
private static final String pwd  = configFile.getProperty("mysql.pwd");

public static String getHost() { return host; }

public static String getPort() { return port; }

public static String getDb() { return db; }

public static String getUser() { return user; }

public static String getPwd() { return pwd; }


public static Connection getCon() {
    Connection con = null;
    try {
        String url = "jdbc:mysql://" + host + ":" + port + "/" + db;
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        con = DriverManager.getConnection(url, user, pwd);

    } catch (SQLException e) {
        e.printStackTrace();
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    return con;
}

private static Properties getConfigFile(String fileName) {
    Properties props = new Properties();
    try {
        InputStream stream = Dao.class.getResourceAsStream(fileName);
        props.load(stream);
    } catch (IOException e) {
        System.err.println("Error opening configuration file");
        System.exit(1);
    }

    return props;
}
}
4

2 に答える 2

2

Eclipse プロジェクトでファイルを読み取る場合、デフォルトの場所はソース ディレクトリであることに注意してください (これが Web アプリケーションの場合、後でクラス ディレクトリに変換されます)。したがって、私のアドバイスは、ファイルをプロジェクトのルート ディレクトリから「src」ディレクトリに移動してから再試行することです。

于 2011-05-16T07:48:53.913 に答える
0

メソッド Dao.class.getResourceAsStream(fileName) は、ターゲット ファイルがクラスパスに存在しない場合、入力ストリームとして null を返します。これが NullPointerException の理由です。

null に対して props.load(stream) を呼び出す前に、それをキャッチするか (現在は IOException のみをキャッチする)、入力ストリームをテストする必要があります。

では、どのルート ディレクトリを意味するのでしょうか。システム ルート、アプリ ソース ルート、アプリ作業ディレクトリ? システム ルートは、構成ファイルを配置する場所としてはかなり不適切です。

「deploy.properties」(先頭にスラッシュなし) でアドレス指定し、クラスパスのルート (「classes」、「bin」、または任意の名前) に配置します。

ソース ディレクトリのデフォルトのパッケージ レベル (ソース ディレクトリ、またはソース ディレクトリとして追加したディレクトリ) に配置すると、コンパイル中に次のようにクラスパスにコピーされます。

/app
  /src
  /config
    deploy.properties 

config ディレクトリをソース ディレクトリとしてプロジェクトに追加します。

于 2011-05-16T07:55:34.553 に答える