1

以下に部分的に示されているクラスには、mainメソッドが含まれています。コードを実行すると、NullPointerException(NPE)が表示され、エラーメッセージが表示されます-「メインクラスが見つかりませんでした。プログラムは終了します」。私の理解では、NPEを取得した場合、それはコードが実行されていることを意味します。つまり、JREがmain実行を開始するメソッドを見つけたのに、なぜエラーメッセージが表示されるのですか?

これはコンソール出力です

java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
at com.MyWorldDemo.getValue(MyWorldDemo.java:57)
at com.MyWorldDemo.<clinit>(MyWorldDemo.java:23)
Exception in thread "main"  

一言で言えば:

  • ユーザー名はプロパティファイルに保存されます。
  • プロパティファイルは次のようなものですusername=superman .... etc

ここにいくつかのコード例があります

class MyClass {
    private final static String username = getData("username"); // ERROR HERE

    private static Properties prop;
    // more variables

    static {
        prop = new Properties();
        try {
            FileInputStream fis = new FileInputStream("MyDB.properties");
            prop.load(fis);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    // this method will assign a value to my final variable username.
    public static String getData(String props) {
        String property = prop.getProperty(props);// ERROR HERE !!!
        return property;
    }
}
4

2 に答える 2

2

静的変数の初期化は、コード内の位置に依存します (変数は上から下に初期化されます)。あなたのコードで

private final static String username = getData("username"); // ERROR HERE
private static Properties prop;
// more variables

static {
    prop = new Properties();
    try {
        FileInputStream fis = new FileInputStream("MyDB.properties");
        prop.load(fis);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}

propオブジェクトはusername静的ブロックで初期化されますが、初期化username propが必要であり、まだ初期化されていないため、NPE が発生します。コードを次のように変更してください。

private static Properties prop = new Properties();
private final static String username = getData("username"); 

static {

    try {
        FileInputStream fis = new FileInputStream("MyDB.properties");
        prop.load(fis);
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}
于 2012-07-26T18:46:34.553 に答える
2

MyWorldDemo23 行目でメソッドを呼び出している静的初期化がgetValueあり、57 行目で NPE が発生しているため、クラスをインスタンス化できないため、メイン メソッドを呼び出すことができません。おそらく次のようになります。

class MyWorldDemo {
    private static String foo = getValue("username");
    private static Properties prop;

    // This happens too late, as getValue is called first
    static {
        prop = new Properties();
        try {
            FileInputStream fis = new FileInputStream("MyDB.properties");
            prop.load(fis);
        } catch(IOException ex) {
            ex.printStackTrace();
        }
    }

    // This will happen before static initialization of prop
    private static String getValue(String propertyValue) {
        // prop is null
        return prop.getProperty(propertyValue);
    }

    public static void main(String args[]) {
        System.out.println("Hello!"); // Never gets here
    }
}
于 2012-07-26T18:37:37.237 に答える