エラーが発生するプログラムを 2つ挙げます。
以前、「staticなメソッド」のところでエラーが発生するプログラムが登場していました。G106プロジェクトと同様のプログラムを、改めて作成しました。
ソースコードは以下の通り。
O201/O201.java
/** * StackOverflowErrorを確認します。 */ public class O201 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { // 無限ループするメソッドを呼び出す O201.loop(); } /** * メソッドを無限に呼び出します。 */ private static void loop() { O201.loop(); } }
実行結果は以下の通り。
Exception in thread "main" java.lang.StackOverflowError at O201.loop(O201.java:19) at O201.loop(O201.java:19) at O201.loop(O201.java:19) (省略) at O201.loop(O201.java:19)
メソッドの中で自身のメソッドを呼び出す無限に呼び出しています。このため、Java仮想マシンのスタックと呼ばれる管理領域がいっぱいになって溢れることでエラーが発生します。エラーの名前 StackOverflowErrorはそういう意味です。スタックの言葉の意味と、Java仮想マシンのスタック領域について解説すると話が非常に長くなるので、省略します。
StackOverflowErrorについて詳細が気になる方は、説明書(API)を参照してください。Java SE 7(Java 1.7)の説明書(API)を掲示しておきます→StackOverflowErrorクラス。
もうひとつのエラーの例として、OutOfMemoryErrorの例を挙げます。
ソースコードは以下の通り。
O202/O202.java
/** * OutOfMemoryErrorを確認します。 */ public class O202 { /** * メインメソッド。 * @param args 引数 */ public static void main(String[] args) { int[] a = new int[1024 * 1024 * 1024]; a[1] = 100; System.out.println("a[1]の値は " + a[1]); } }
実行結果は以下の通り。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at O202.main(O202.java:11)
11行目で、int[]型のインスタンスを作成していますが、Java仮想マシン上に 4ギガバイトのメモリを要求しています(int型は 32ビット = 4バイトで、1ギガ個の変数を宣言しようとしているため、理論値は 4ギガバイトになります)。お使いのパソコンが 4ギガバイトのメモリを搭載していないか、Java仮想マシンに 4ギガバイトのメモリを使用することを許可されていない場合には、ソースコード上で指示されたメモリを確保することに失敗し、OutOfMemoryErrorが発生します。
OutOfMemoryErrorについて詳細が気になる方は、説明書(API)を参照してください。Java SE 7(Java 1.7)の説明書(API)を掲示しておきます→OutOfMemoryErrorクラス。
先の節にも書きましたが、エラーは、Java仮想マシンでは手に負えないような異常な出来事が発生してしたことを表します。そのため、プログラムが強制終了することは致し方ないということになります。
エラーを try catch構文を用いて捕捉することは「文法上は」可能ですが、現実には、捕捉したところでどうにもなりません。従って try catch構文は使用しないで下さい。
先の例で言えば、O201プロジェクトはソースコードの間違いによるものなので、修正が必要です。また O202プロジェクトは、プログラム上で使用するメモリをもっと少なくするか、あるいは Java仮想マシンに与えられるメモリ量を増やす設定をする必要があります。