0

Javaコードでランタイムエラーが発生し、その背後にある理由を理解しようとしています。二重アスタリスクの間の2つの静的アクセス修飾子は、問題の項目です。コードは、これらの修飾子の有無にかかわらずコンパイルされます(もちろんアスタリスクは削除されます)。ただし、実行時には、修飾子が存在する場合にのみエラーなしで実行されます。どうしてこれなの?静的修飾子が存在しない場合に実行時に生成されるエラーは、コードの下に貼り付けられます。手伝ってくれてどうもありがとう!

コードは次のとおりです。

public class Blue {


    public int[][] multiArray(int x, int y){

        int[][] myArray = new int[x][y];
        return myArray;

    }

    static Blue blueObject = new Blue();

    public **static** int[][] one = blueObject.multiArray(3,3); 
    public **static** int[][] two = blueObject.multiArray(3,3);

    public static void main(String[] args){

        System.out.println("Hello world!");

    }

}

静的アクセス修飾子なしで実行時に生成されたエラー:

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.NullPointerException
    at Blue.<init>(Blue.java:13)
    at Blue.<clinit>(Blue.java:11)
4

3 に答える 3

0

これは、blueObjectを静的として宣言したため、定義を次のように変更します。

Test blueObject = new Test();

そしてそれは実行されます!

「シングルトンモード」(すべてが静的)または「オブジェクトモード」(オブジェクトを作成し、オブジェクトを介してクラスメソッドを呼び出す)のいずれかで動作します。両方を使用することはできません。

于 2013-02-15T03:36:06.137 に答える
0

この問題は、JVMがクラスのロードを処理する方法と、クラスが定義される方法に関連しています。static int [] []を 使用すると、JVMがクラスで表されるのと同じ順序で静的コードを読み取り/ロードするため、機能します。したがって、JVMがint [] []を初期化しようとすると、静的BlueblueObjectを使用できるようになります。

ただし、int [] []を非静的として宣言すると、JVMが静的Blue blueObjectを作成しようとすると、完全に初期化されたBlueオブジェクトを作成し、静的blueobjectに割り当てる必要があるため、int[][を初期化しようとします。 ]; ただし、現時点では、静的なblueObject .multiArray(3,3); まだ準備ができていません。

これがあなたの質問に意味があることを願っています。

于 2013-02-15T03:50:26.703 に答える
0

@ user1419674 通常、JVMは最初に静的変数を初期化し、次にインスタンス変数を初期化します。また、静的変数は、コードが最初に呼び出されたときに1回だけ初期化されます。

public class Test {
    public Test(){
        System.out.println("constructor of class Test");
    }
}

public class App {
    private Test test = new Test();
    private static int s_i;
    static {
        s_i = 1;
        System.out.println("initializing static field");
    }

    public static void main(String args[]) {
        App app1 = new App();
        App app2 = new App();
    }
}

上記のコードを実行すると、次のように出力されます。

initializing static field
constructor of class Test
constructor of class Test

ただし、コードでは、静的変数はBlue自体のタイプです。そして、静的Blue blueObjectの初期化は、実際には静的BlueblueObjectを必要とするint[][]の初期化に依存しているようになります。

于 2013-02-16T01:46:24.050 に答える