Day 62 のゴールと全体像
Day 62 では、「エラーを読む力」をテーマにしていきます。 コードを書いていると、必ずと言っていいほどエラーに出会いますが、 ここで差がつくのは 「エラーを怖がるか」「エラーを味方にするか」 です。
今日扱うのは次の5つです。
- コンパイルエラー
- 実行時エラー
- NullReferenceException
- IndexOutOfRangeException
- FormatException
どれも C# を書いていると、かなりの頻度で出会う“おなじみの顔ぶれ”です。 ひとつひとつ、例題コードを交えながら、 「どういうときに出るのか」「どう読めばいいのか」「どう直せばいいのか」を ステップバイステップで見ていきます。
コンパイルエラー ― 「そもそも翻訳できません」
コンパイルエラーとは
コンパイルエラーは、
「C# の文法としておかしいので、機械語に翻訳できません」
という種類のエラーです。
プログラムを「ビルド」したり「デバッグ実行」しようとしたときに、 Visual Studio がコードをチェックして、 文法的におかしいところがあると、コンパイルエラーとして教えてくれます。
代表的なコンパイルエラーの例
例1:セミコロンの付け忘れ
using System;
class Program
{
static void Main()
{
int x = 10 // ← セミコロンがない
Console.WriteLine(x);
}
}
C#このコードをビルドすると、
- 「; が必要です」
- 「ステートメントの終わりがありません」
といったメッセージが表示されます。
例2:存在しない変数を使っている
using System;
class Program
{
static void Main()
{
int x = 10;
Console.WriteLine(y); // ← y は宣言されていない
}
}
C#この場合は、
- 「名前 ‘y’ は現在のコンテキストに存在しません」
というようなメッセージが出ます。
コンパイルエラーの読み方のポイント
- エラーメッセージの最初の1行をしっかり読む
- 何が足りないのか
- 何が間違っているのか
- 行番号を確認する
- どの行で問題が起きているか
- 赤い波線(下線)をたどる
- Visual Studio が「ここがおかしいよ」と教えてくれている場所です
コンパイルエラーは、 「文法的なミス」を教えてくれる“優しい先生”のような存在です。 落ち着いてメッセージを読むと、 意外とそのままヒントになっていることが多いです。
実行時エラー ― 「走り出してから転ぶ」
実行時エラーとは
実行時エラーは、
「文法的には正しいけれど、実際に動かしてみたら問題が起きました」
という種類のエラーです。
コンパイルは通るので、プログラムは一応動き始めますが、 途中で例外(Exception)が発生して、 プログラムが止まってしまいます。
実行時エラーの代表例
NullReferenceExceptionIndexOutOfRangeExceptionFormatException
などが、初心者の方がよく出会う実行時エラーです。 ここからは、それぞれを具体的に見ていきます。
NullReferenceException ― 「中身がないのに触ろうとした」
どんなときに起きるか
NullReferenceException は、
「null(何も入っていない状態)の変数に対して、プロパティやメソッドを呼び出そうとした」
ときに発生します。
例:文字列の長さを調べようとしているけれど…
using System;
class Program
{
static void Main()
{
string message = null; // 何も入っていない
// ここで例外が発生する
int length = message.Length;
Console.WriteLine($"長さは {length} です。");
}
}
C#このコードを実行すると、
System.NullReferenceException- 「オブジェクト参照がオブジェクト インスタンスに設定されていません」
といったメッセージが表示されます。
エラーメッセージの読み方
- 例外の種類:
NullReferenceException - 行番号:
message.Lengthの行 - 「オブジェクト参照がオブジェクト インスタンスに設定されていません」 → 「変数はあるけれど、中身が null のままだよ」という意味です。
どう直せばいいか
- null になっている原因を探す
- そもそも値を代入していない
- 条件分岐の結果、代入されないパターンがある
- null チェックを入れる
if (message != null)
{
int length = message.Length;
Console.WriteLine($"長さは {length} です。");
}
else
{
Console.WriteLine("message が null です。");
}
C#NullReferenceException の感覚
NullReferenceException は、
「空っぽの箱に手を突っ込んで、中身を取り出そうとしている」
ようなイメージです。
- その箱に何か入っているのか
- まだ何も入れていないのか
を意識しながらコードを書く癖をつけると、 この例外とはだんだん仲良くなれます。
IndexOutOfRangeException ― 「配列の外側を触ろうとした」
どんなときに起きるか
IndexOutOfRangeException は、
「配列やリストの範囲外のインデックスを指定した」
ときに発生します。
例:配列の範囲を超えてアクセスしている
using System;
class Program
{
static void Main()
{
int[] numbers = { 1, 2, 3 };
// 有効なインデックスは 0, 1, 2
// ここで範囲外の 3 を指定してしまう
int value = numbers[3];
Console.WriteLine(value);
}
}
C#このコードを実行すると、
System.IndexOutOfRangeException- 「インデックスが配列の範囲外です」
というメッセージが表示されます。
エラーメッセージの読み方
- 例外の種類:
IndexOutOfRangeException - 行番号:
numbers[3]の行 - 「インデックスが配列の範囲外です」 → 「そのインデックスは存在しないよ」という意味です。
どう直せばいいか
- 配列やリストの長さを確認する
Console.WriteLine(numbers.Length); // 3 が表示される
C#- インデックスが 0 以上 Length 未満になっているか確認する
for (int i = 0; i < numbers.Length; i++)
{
Console.WriteLine(numbers[i]);
}
C#- 固定値で指定している場合は、単純なミスを疑う
numbers[3]→numbers[2]に直す- そもそも配列の要素数を増やす
IndexOutOfRangeException の感覚
IndexOutOfRangeException は、
「3つしか引き出しがない棚なのに、4つ目の引き出しを開けようとしている」
ようなイメージです。
- 何個の引き出しがあるのか(Length)
- 何番目の引き出しを開けようとしているのか(インデックス)
を意識しながらコードを書くと、 この例外もだんだん怖くなくなってきます。
FormatException ― 「その形では読み取れません」
どんなときに起きるか
FormatException は、
「文字列を数値や日付などに変換しようとしたときに、形式が合っていない」
ときに発生します。
例:数字に変換できない文字列を int にしようとしている
using System;
class Program
{
static void Main()
{
Console.Write("年齢を入力してください: ");
string input = Console.ReadLine();
// ここで FormatException が発生する可能性がある
int age = int.Parse(input);
Console.WriteLine($"あなたの年齢は {age} 歳ですね。");
}
}
C#このコードで、
- 「20」 → 正常に変換される
- 「二十」 →
FormatExceptionが発生する - 「abc」 →
FormatExceptionが発生する
というような動きになります。
エラーメッセージの読み方
- 例外の種類:
FormatException - 行番号:
int.Parse(input)の行 - 「入力文字列の形式が正しくありません」
→ 「その文字列は、int に変換できる形じゃないよ」という意味です。
どう直せばいいか
- TryParse を使って安全に変換する
Console.Write("年齢を入力してください: ");
string input = Console.ReadLine();
if (int.TryParse(input, out int age))
{
Console.WriteLine($"あなたの年齢は {age} 歳ですね。");
}
else
{
Console.WriteLine("数字で入力してください。");
}
C#- 入力値の形式を事前にチェックする
- 必要なら、正規表現や文字数チェックなどを使う
FormatException の感覚
FormatException は、
「郵便番号を入力してほしいところに、住所を丸ごと書いてしまった」
ようなイメージです。
- どんな形式を期待しているのか
- 実際に渡している文字列は、その形式に合っているのか
を意識しながらコードを書くと、 この例外も“入力チェックのきっかけ”として頼もしい存在になっていきます。
コンパイルエラーと実行時エラーの違いを整理する
ここまでの内容を、少し整理しておきます。
コンパイルエラー
- いつ起きるか: ビルド時・実行前
- 原因: 文法的なミス
- セミコロンの付け忘れ
- 宣言していない変数の使用
- 型が合わない代入 など
- 対処:
- エラーメッセージと行番号を確認する
- 赤い波線の場所を修正する
実行時エラー(例外)
- いつ起きるか: 実行中
- 原因: ロジックや入力値の問題
- null のままアクセスしている(NullReferenceException)
- 配列の範囲外を指定している(IndexOutOfRangeException)
- 形式の合わない文字列を変換している(FormatException)
- 対処:
- 例外の種類を確認する
- 行番号を確認する
- デバッグ(ブレークポイント・ステップ実行・変数確認)で原因を追う
エラーの種類とタイミングが分かってくると、 「どこから手をつければいいか」が見えやすくなります。
エラーを読むためのミニテンプレート
最後に、「エラーを読むときの筋道」をテンプレートとしてまとめておきます。
- まず、エラーの種類を見る
- コンパイルエラーか
- 実行時エラー(例外)か
- メッセージの最初の1行をしっかり読む
- 「何が問題だと言っているのか」をつかむ
- 行番号を確認する
- どの行で問題が起きているか
- その行のコードをじっくり眺める
- 変数の値はどうなっているか
- 配列やリストの範囲はどうなっているか
- 入力値の形式はどうなっているか
- 必要ならデバッグで追いかける
- ブレークポイントを置く
- ステップ実行する
- 変数確認をする
- 原因を特定して、コードを修正する
この流れに慣れてくると、 エラーは「怒られている感じのメッセージ」ではなく、 「ここがおかしいよ」と教えてくれる頼れる相棒に見えてきます。
Day 62 のまとめ
Day 62 では、
- コンパイルエラー(文法的なミス)
- 実行時エラー(例外)
- NullReferenceException(null に触ろうとした)
- IndexOutOfRangeException(範囲外のインデックスを指定した)
- FormatException(形式の合わない文字列を変換しようとした)
という、C# でよく出会うエラーたちを、 例題コードとともにじっくり見ていきました。
エラーは、最初はどうしても怖く見えますが、 「種類」「メッセージ」「行番号」の3つを落ち着いて読む癖がついてくると、 むしろ「ありがたいヒント」に変わっていきます。
ぜひ、
- わざと NullReferenceException や IndexOutOfRangeException を起こしてみる
- エラーメッセージを読んで「何を言っているか」を言葉にしてみる
- TryParse や null チェックなど、“防御的なコード”を書いてみる
といった小さな練習を重ねながら、 エラーと少しずつ仲良くなっていっていただければうれしいです。
