【Java】レッスン2-8:エラーメッセージを読めるようになろう

一つ前のページでは配列について学習しました。
今回は エラーメッセージ について見ていきましょう。
Lesson1:基礎文法編
Lesson2:制御構造編
・Lesson2-1:比較演算子と論理演算子を理解しよう
・Lesson2-2:if文による分岐処理を理解しよう
・Lesson2-3:switch文による分岐処理を理解しよう
・Lesson2-4:for文による繰り返し処理を理解しよう
・Lesson2-5:while文による繰り返し処理を理解しよう
・Lesson2-6:繰り返しを制御しよう
・Lesson2-7:配列を理解しよう
・Lesson2-8:エラーメッセージを読めるようになろう ◁今回はココ
・Lesson2-9:例外処理を理解しよう
・確認問題2-☆1:ハイアンドロー ゲームを作ろう
・確認問題2-☆2:数字当てゲームを作ろう
・確認問題2-☆3:じゃんけんゲームを作ろう
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:クラス編
エラーメッセージの読み方と原因別解説
プログラムを書いていると、「Cannot find symbol」や「NullPointerException」といったエラーメッセージに遭遇することがあります。
初めて見ると難しそうに感じますが、エラーは単なる「問題の場所と内容を教えてくれる案内板」です。
エラーメッセージの読み方を理解し、原因と対処法を整理できるようになれば、コードのバグを自分で発見・修正できる力が身につきます。
この記事では、エラーメッセージの構造や代表的なエラーの例を初心者向けにわかりやすく解説し、解決までのステップを実践的に紹介します。
さっそく読み進めて、エラーを味方にできるスキルを身につけましょう。

エラーメッセージとは?|意味と役割を理解しよう
エラーメッセージは、Javaが「何らかの問題が発生した」ことをあなたに知らせるための“お知らせ”のようなものです。
単なる赤い警告文ではなく、「どこで」「何が」起きたのかを教えてくれる重要な手がかりになります。
Javaのエラーメッセージは大きく次の要素から構成されます。
- エラーの種類(例:
NullPointerException
)
何が原因で動作できなかったのかを示す名前。専門用語が多いですが、原因を特定するための重要なヒントです。 - 詳細な説明
なぜそのエラーが起きたのかを補足する文章。短い一文で原因や状況を示してくれます。 - スタックトレース(Stack Trace)
エラーが発生した場所や、そこに至るまでの呼び出し経路を行番号付きで表示したもの。コードの“事件現場”を特定できます。
エラーメッセージを読み解けるようになると、プログラムの問題解決スピードは格段に上がります。
逆に、内容を無視して修正を試みると、原因の見当違いな修正をしてしまい、時間を浪費することもあります。
初心者がつまずくJavaの4大例外を解説
実際によく遭遇する代表的なエラーと、その解決方法を具体例を交えて解説します。
Cannot find symbolとは?|未定義シンボルに注意しよう
Cannot find symbol
は、Javaコンパイラが「あなたが書いたコードの中で指定された名前(シンボル)を見つけられない」ことを意味するコンパイルエラーです。
ここでいう「シンボル(symbol)」とは、変数名・メソッド名・クラス名など、コード上で識別子として使う名前のことです。
主な原因としては、スペルミス、変数やメソッドの宣言が漏れている、または適切なインポートが行われていないことが挙げられます。
例えば変数名を「count」と宣言していたのに「cunt」と誤記して使用すると、このエラーが発生します。
int count = 5; System.out.println(cunt); // Cannot find symbolエラー
Cannot find symbolの主な発生原因は以下の通りです。
- スペルミス(最も多い)
- 宣言していない変数・メソッド・クラスの使用
- スコープの外から変数やメソッドを呼び出そうとしている
- 必要なクラスをインポートしていない
- メソッドやクラスのアクセス修飾子の制約で見えない場合
また代表的な解決のポイントは以下の通りです。
- エラーメッセージに表示される
symbol
(探している名前)とlocation
(探す場所)を確認する - スペルや大文字・小文字を正しく書いているかチェックする
- 宣言位置やスコープを見直す
- 外部クラスを使う場合は
import
文を忘れていないか確認する
NullPointerExceptionとは?|原因と防ぐ方法
NullPointerException
は、変数が null
(何も参照していない状態)なのに、その変数を使ってメソッド呼び出しやフィールドアクセスを行おうとしたときに発生する実行時例外です。
null
は「参照先が存在しない」ことを表す特別な値で、配列・オブジェクト型の変数にしか入りません。
プリミティブ型(int
, double
, boolean
など)には null
は入れられません。
例えばオブジェクトを初期化せずにメソッドを呼び出そうとした場合や、配列の要素がnull(空)のままでアクセスしようとした場合に発生します。
String text = null; System.out.println(text.length()); // NullPointerExceptionエラー
NullPointerException
の主な発生原因は以下の通りです。
- 配列やリストの要素が null
- 戻り値が null のメソッドをそのまま使っている
- 変数の初期化順序や条件分岐の影響で null が残っている
また代表的な解決のポイントは以下の通りです。
- 原因となるメソッドの戻り値仕様を把握
- null チェックを行う:
if (text != null) {}
ArrayIndexOutOfBoundsExceptionとは?|配列の範囲チェックが鍵
ArrayIndexOutOfBoundsException
は、配列の存在しない位置(インデックス)を参照しようとしたときに発生する実行時エラー(例外)です。
Java の配列は 0 から始まるため、最後の要素のインデックスは 配列の長さ – 1 になります。
それを超えた位置や、負のインデックスを指定するとこの例外が発生します。
例えば5つの要素を持つ配列に対してインデックス6でアクセスしようとすると、このエラーが発生します。
int[] numbers = {1, 2, 3, 4, 5}; System.out.println(numbers[5]); // ArrayIndexOutOfBoundsExceptionエラー
ArrayIndexOutOfBoundsException
の主な発生原因は以下の通りです。
- 配列の長さを勘違い
- 負のインデックスを指定
- 別のメソッドから返ってきた配列のサイズを確認していない
また代表的な解決のポイントは以下の通りです。
- 配列の有効範囲は
0 ~ (配列.length - 1)
であることを意識する - ループでは
i < 配列.length
のように<
を使う - インデックスを計算で求める場合、結果が範囲内かチェックする
- 配列の長さを使う際は
.length
を使ってハードコーディングを避ける
ArithmeticExceptionとは?|ゼロ除算の落とし穴
ArithmeticException
は、不正な算術演算を行ったときに発生する実行時例外です。
Javaでは、算術演算中に特定の条件(特に整数のゼロ除算)が発生すると、自動的にこの例外がスローされます。
浮動小数点型(double
やfloat
)でのゼロ除算はInfinityやNaN(Not a Number)として処理されますが、整数型ではエラーになります。
int result = 10 / 0; // ArithmeticExceptionエラー
ArithmeticException
の主な発生原因は以下の通りです。
- 整数型(
int
,long
など)でのゼロ割り - 整数のオーバーフローを意識しない計算
- 算術演算の結果が定義されない場合
また代表的な解決のポイントは以下の通りです。
- 割る前にゼロかどうかチェックする
- 浮動小数点型を使う場合はInfinityやNaNの確認
まとめ|エラーを味方に変えて前進しよう
エラーメッセージは、単なる「エラーの通知」ではなく、問題解決への道しるべであることを学びました。
今回の内容を通して、メッセージの意味を正しく読み取り、Cannot find symbol
や NullPointerException
、配列範囲外、ゼロ除算といった代表的な例外の原因と対処方法を自分で判断できる力が身についたはずです。
これからの学習ではより複雑なコードにも挑戦することになりますが、このスキルがあればエラーに臆することなく前進できます。
エラーを敵ではなく味方に変えて、一歩ずつ確実にステップアップしていきましょう。
練習問題|エラーを見てバグを特定・修正してみよう

以下のコードをコピーして実行してみましょう。
そうすると複数のエラーが発生しますので、表示されるエラーメッセージを参考にしてエラー箇所を特定し、正しいコードを書きましょう。
public class ErrorExamples { public static void main(String[] args) { System.out.println(count); String text = null; System.out.println(text.length()); int[] numbers = {1, 2, 3}; System.out.println(numbers[ 3]); int a = 10; int b = 0; int result = a / b; System.out.println(result); } }
練習問題の解答と解説
この問題の正解コードとその解説は以下の通りです。
クリックして開いて確認してください。
- 正解コード
-
public class ErrorExamples { public static void main(String[] args) { // 1. Cannot find symbol エラー String count = "Cannot find symbolエラー"; System.out.println(count); // 解説:count変数は宣言されていなかった、Cannot find symbolエラーが発生しました。 // 2. NullPointerException エラー String text = "NullPointerException エラー"; System.out.println(text.length()); // 解説:textがnullだったので、そのメソッドlength()を呼び出すとエラーが発生しました。 // 3. ArrayIndexOutOfBoundsException エラー int[] numbers = {1, 2, 3}; System.out.println(numbers[ 2]); // 解説:配列numbersのインデックスは0から2までしかないため、3番目にアクセスするとエラーになりました。 // 4. ArithmeticException エラー int a = 10; int b = 1; int result = a / b; System.out.println(result); // 解説:整数のゼロ除算はArithmeticExceptionを引き起こします。 } }
- 正解コードの解説
-
非常にシンプルなコードのため解説はありません。
難しいと感じる方は上記の用語の説明を見返してみてください。