質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

6244閲覧

staticなarrayListの初期化について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/11/15 13:48

静的なArrayListを初期化したいのですが、エラーメッセージが出てしまい、初期化することができません。
Exception in thread "main" java.lang.ExceptionInInitializerError
at panels.LoginPanel.<init>(LoginPanel.java:37)
at panels.MainFrame.<init>(MainFrame.java:25)
at panels.MainFrame.main(MainFrame.java:110)
Caused by: java.lang.NullPointerException
at Actor.Administrator.addMax(Administrator.java:100)
at Actor.Administrator$1.<init>(Administrator.java:29)
at Actor.Administrator.<clinit>(Administrator.java:22)
... 3 more

よろしくお願いします。

java

1//Administratorクラスのフィールドとメソッドです。 2public static ArrayList<MaxReg> listMax = new ArrayList<MaxReg>() { 3 { 4 addMax("maxRegCul", 5, Administrator.listMax); 5 addMax("maxRegPro", 5, Administrator.listMax); 6 addMax("maxRegHun", 5, Administrator.listMax); 7 addMax("maxRegPhy", 5, Administrator.listMax); 8 addMax("maxRegJava", 5, Administrator.listMax); 9 addMax("maxRegJap", 5, Administrator.listMax); 10 addMax("maxRegLin", 5, Administrator.listMax); 11 addMax("maxRegC", 5, Administrator.listMax); 12 addMax("maxRegChi", 5, Administrator.listMax); 13 } 14 }; 15 16public static void addMax(String name, int num, ArrayList<MaxReg> listMax) { 17 listMax.add(new MaxReg(name, num)); 18 } 19 20//MaxRegクラスのフィールドとメソッドです。 21 public String id; 22 public int maxNum; 23 24 public MaxReg(String id, int maxNum) { 25 this.id = id; 26 this.maxNum = maxNum; 27 } 28

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

どのような順番で処理が進むか考えてみてください。

java

1A a = new A() { 2 { 3 System.out.println(A.a); // <== (1) 4 } 5};

このように書くとnullが印字されますが、それはなぜかという問題です。

(1)はいつ実行されるでしょうか?
=>それは右辺のAクラスのインスタンス生成中です。

(2) 変数aにはいつインスタンスが代入されるでしょうか?
=>それは右辺の評価が完了したとき(Aクラスのインスタンスを生成し終わった時)です。

つまり変数に値が代入されるまえに(1)が実行されているわけです。JVMは例え初期化されていないフィールドの値でも「不定値」が入るような状況を許しません。そのため、インスタンス生成時にはユーザーが記述したあらゆる初期化コードの実行に先立って無条件に(数値なら0、参照型ならnullで)初期化します。ということで(1)の時点で未初期化のフィールドを参照するとnullとなります。

投稿2017/11/15 14:37

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/11/15 15:38 編集

回答ありがとうございます。 以下のように修正してみました。 public static ArrayList<MaxReg> listMax = new ArrayList<MaxReg>() ; static{ //ここで初期化 } でエラーは起きなくなりました。 ありがとうございました。
KSwordOfHaste

2017/11/15 15:43 編集

変数名を間違えてないでしょうか?listMaxとlistSubになってますよ? --- あ、解決したのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問