現在Javaを勉強中なのですが、
以下のコードの結果の違いがなぜ起きるのかを知りたいと思っています。
結論から言うと、
なぜ
Main1は「実行時例外(ExceptionInInitializerError)」で
Main2は「コンパイルエラー」なのでしょうか?
Java
1public class Main1 { 2 3 private static int[] array; 4 static { 5 array[0] = 10; 6 } 7 8 public static void main(String[] args) { 9 System.out.println(array[0]); 10 } 11}
Java
1public class Main2 { 2 3 public static void main(String[] args) { 4 int[] num; 5 num[0]=111; 6 num[1]=222; 7 num[2]=333; 8 System.out.println(num[0]+num[1]+num[2]); 9 } 10} 11
そもそもエラーが起こる原因は配列のインスタンスを生成していないからだと思います。
その上で「実行時例外」と「コンパイルエラー」という違いが生まれるのは
Main1がstatic変数で、Main2がローカル変数であることが原因だと思っています。
Main2のローカル変数「int[] num;」を「static int[] num;」に変え、mainメソッドの外に出すと、つまりstatic変数にするとコンパイルエラーは消え、実行時例外に変わるからです。
またインスタンス変数がヒープ領域にオブジェクトごとにメンバを保持するのに対し、
static変数はstatic領域に1つのメンバを保持するということも知っています。
ただその知識とMain1のコードがなぜコンパイルエラーにならないかということが結びついていません。
「Main1クラスはstatic変数であることで、『どうなるから』コンパイルエラーではなく、実行時例外になる。」という部分について教えていただきたいです。
そこに関してもし分かる方がいらっしゃれば教えていただけると幸いです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/02 15:15
2015/10/02 15:20
2015/10/02 15:29