今回はjavaで出るエラーについて書いて見ます。
コンパイルエラー
ます初心者にありがちなコンパイルエラーと対処方法を紹介します。
- セミコロン「;」が不足
- ダブルクオーテーション「”」が不足
- 全角空白文字
- ファイル名とクラス名が異なる
- 閉じ括弧「}」
などあります。
セミコロン「;」が不足
Javaの記述ルールは、1つの命令ごとにセミコロン「;」をつける決まりです。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!") // ← セミコロン(「;」)が足りない
}
}
ダブルクオーテーション「”」が不足
文字列の終わりのダブルクオーテーション「”」が不足していると、こんなエラーが起きます。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!); ← World!の後に「"」がない
}
}
全角空白文字
本来「半角空白」文字を入れるべきところに、「全角空白」文字を入れてしまったことから発生してます。
public □ class HelloWorld { // ← publicの後に全角空白(□)
public static void main(String[] args) {
System.out.println("Hello World!")
}
}
ファイル名とクラス名が異なる
例をあげると
ソースファイルに記述されているクラス名が「HelloWorld」であるのに対し
ファイル名を「Hello.java」としたために発生します。
Javaでは、一つのファイルに一つのクラスを記述し
ファイル名は「クラス名.java」とする決まりです。
閉じ括弧「}」
数十行のプログラムで、if(){}やfor(){}のような段落のとじ括弧が不足していると
非常にわかりづらいです。
public static void main(String[] args) {
System.out.println("Hello World!")
// ← 「}」がない
}
構文エラー
少し難しくなって、配列やif構文で出てくるエラー内容を紹介します。
主な内容はこちら
- java.lang.NullPointerException
- java.lang.ArrayIndexOutOfBoundsException
- java.lang.NumberFormatException
- java.lang.ClassCastException
- java.lang.ArithmeticException
- java.lang.NoClassDefFoundError
- java.lang.OutOfMemoryError
java.lang.NullPointerException
このエラーはnullのオブジェクトに対してアクセスしようとしたときに発生する。
プログラミング時に比較的発生しやすいエラーで、エンジニアの間では「ヌルポ」と呼ばれています。
対策
- インスタンスの生成や値の設定が正しく行われているかをチェックする。
- オブジェクトがnullになってしまうタイミングをデバッグで確認する。
- プログラムでオブジェクトがnullかどうかのチェックを行い、エラーの発生をできる限り回避する。
java.lang.ArrayIndexOutOfBoundsException
配列のインデックスとして存在しない要素を指定した場合に発生するエラーで
先ほどのエラーの例でも紹介した。配列のインデックスとして1~9のインデックスしかないところ
10のインデックスに値を設定しようとする場合などに発生する。
対策
* 正しい配列のインデックスを指定できているかチェックする。
* 配列の設定を繰り返し処理で行っている場合、繰り返し回数などに問題がないかチェックする。
java.lang.NumberFormatException
このエラーは文字列の値を数値に変換(キャスト)しようとしたが
文字列に数値として正しくない値が設定されている場合に発生する。
対策
- 文字列にアルファベットや記号など、数値以外の文字が設定されていないかチェックする。
- 文字列に空白やnullが設定されていないかチェックする。
- 文字列には数値が設定されているが、変換しようとしている数値型で扱える値の範囲をオーバーしていないかチェックする。
java.lang.ClassCastException
このエラーはあるクラスを変換できないクラスにキャストしようとした時に発生する。
対策
- 配列などに設定した値のクラスと、値を取り出す時にキャストしようとしている型が一致しているかをチェックする。
- 継承関係のある2つのクラスで、サブクラスにスーパークラスをキャストしようとしていないかをチェックする。
java.lang.ArithmeticException
このエラーは数値の計算において、不正な算術処理が行われた場合に発生する。例えば数学的にあり得ない「ゼロ除算(10÷0 など)」が発生するとこのエラーが発生する。
対策
- ゼロ除算が行われてないかをチェックする。
- 数値型変数で計算している場合、割る数の変数にゼロが設定されていないかチェックする
java.lang.NoClassDefFoundError
メソッドを呼び出す時や、インスタンスを生成しようとしている時に
Javaがクラス定義を読み込むことができないエラーです。
対策
- 環境変数CLASSPATHが誤っている可能性があるのでチェックする。
- ファイル名やパッケージ名に誤りがないかチェックする。
- プログラムに必要な外部ファイル(jar)が読み込まれているかチェックする。
java.lang.OutOfMemoryError
Javaは実行時にスタック領域とヒープ領域という2つのメモリー領域を使用するが
このエラーはプログラムの実行に必要なヒープ領域のメモリーサイズが不足した時に発生する。
ヒープ領域とはクラスやメソッドの定義など、オブジェクトのインスタンスが割り当てられるメモリー領域のことだ。
対策
- プログラム内で無限ループになっていしまっている箇所がないかチェックする。
- 一度に大量のデータを処理しようとしている箇所がないかチェックする。
- 不必要にスコープ(公開範囲)が広いメソッドや変数を多用していないかチェックする。