基礎から学ぶC#入門 90日コース | 実践力を高める - Day 62:エラーを読む力

Web APP 90日で身につけるC#
スポンサーリンク
スポンサーリンク

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)が発生して、 プログラムが止まってしまいます。

実行時エラーの代表例

  • NullReferenceException
  • IndexOutOfRangeException
  • FormatException

などが、初心者の方がよく出会う実行時エラーです。 ここからは、それぞれを具体的に見ていきます。

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 のままだよ」という意味です。

どう直せばいいか

  1. null になっている原因を探す
    • そもそも値を代入していない
    • 条件分岐の結果、代入されないパターンがある
  2. 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] の行
  • 「インデックスが配列の範囲外です」 → 「そのインデックスは存在しないよ」という意味です。

どう直せばいいか

  1. 配列やリストの長さを確認する
Console.WriteLine(numbers.Length); // 3 が表示される
C#
  1. インデックスが 0 以上 Length 未満になっているか確認する
for (int i = 0; i < numbers.Length; i++)
{
    Console.WriteLine(numbers[i]);
}
C#
  1. 固定値で指定している場合は、単純なミスを疑う
    • 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 に変換できる形じゃないよ」という意味です。

どう直せばいいか

  1. TryParse を使って安全に変換する
Console.Write("年齢を入力してください: ");
string input = Console.ReadLine();

if (int.TryParse(input, out int age))
{
    Console.WriteLine($"あなたの年齢は {age} 歳ですね。");
}
else
{
    Console.WriteLine("数字で入力してください。");
}
C#
  1. 入力値の形式を事前にチェックする
    • 必要なら、正規表現や文字数チェックなどを使う

FormatException の感覚

FormatException は、

「郵便番号を入力してほしいところに、住所を丸ごと書いてしまった」

ようなイメージです。

  • どんな形式を期待しているのか
  • 実際に渡している文字列は、その形式に合っているのか

を意識しながらコードを書くと、 この例外も“入力チェックのきっかけ”として頼もしい存在になっていきます。

コンパイルエラーと実行時エラーの違いを整理する

ここまでの内容を、少し整理しておきます。

コンパイルエラー

  • いつ起きるか: ビルド時・実行前
  • 原因: 文法的なミス
    • セミコロンの付け忘れ
    • 宣言していない変数の使用
    • 型が合わない代入 など
  • 対処:
    • エラーメッセージと行番号を確認する
    • 赤い波線の場所を修正する

実行時エラー(例外)

  • いつ起きるか: 実行中
  • 原因: ロジックや入力値の問題
    • null のままアクセスしている(NullReferenceException)
    • 配列の範囲外を指定している(IndexOutOfRangeException)
    • 形式の合わない文字列を変換している(FormatException)
  • 対処:
    • 例外の種類を確認する
    • 行番号を確認する
    • デバッグ(ブレークポイント・ステップ実行・変数確認)で原因を追う

エラーの種類とタイミングが分かってくると、 「どこから手をつければいいか」が見えやすくなります。

エラーを読むためのミニテンプレート

最後に、「エラーを読むときの筋道」をテンプレートとしてまとめておきます。

  1. まず、エラーの種類を見る
    • コンパイルエラーか
    • 実行時エラー(例外)か
  2. メッセージの最初の1行をしっかり読む
    • 「何が問題だと言っているのか」をつかむ
  3. 行番号を確認する
    • どの行で問題が起きているか
  4. その行のコードをじっくり眺める
    • 変数の値はどうなっているか
    • 配列やリストの範囲はどうなっているか
    • 入力値の形式はどうなっているか
  5. 必要ならデバッグで追いかける
    • ブレークポイントを置く
    • ステップ実行する
    • 変数確認をする
  6. 原因を特定して、コードを修正する

この流れに慣れてくると、 エラーは「怒られている感じのメッセージ」ではなく、 「ここがおかしいよ」と教えてくれる頼れる相棒に見えてきます。

Day 62 のまとめ

Day 62 では、

  • コンパイルエラー(文法的なミス)
  • 実行時エラー(例外)
  • NullReferenceException(null に触ろうとした)
  • IndexOutOfRangeException(範囲外のインデックスを指定した)
  • FormatException(形式の合わない文字列を変換しようとした)

という、C# でよく出会うエラーたちを、 例題コードとともにじっくり見ていきました。

エラーは、最初はどうしても怖く見えますが、 「種類」「メッセージ」「行番号」の3つを落ち着いて読む癖がついてくると、 むしろ「ありがたいヒント」に変わっていきます。

ぜひ、

  • わざと NullReferenceException や IndexOutOfRangeException を起こしてみる
  • エラーメッセージを読んで「何を言っているか」を言葉にしてみる
  • TryParse や null チェックなど、“防御的なコード”を書いてみる

といった小さな練習を重ねながら、 エラーと少しずつ仲良くなっていっていただければうれしいです。

タイトルとURLをコピーしました