🙌

【初心者向け】プログラミングのエラーの種類と対処法

2025/03/08に公開

プログラミングを学び始めると必ず遭遇するのが「エラー」です。最初は英語のエラーメッセージを見ただけで心が折れそうになるかもしれませんが、実はエラーは私たちの良き先生です。この記事では、プログラミングでよく遭遇するエラーの種類と、その対処法について具体例を交えて解説します。

エラーとは何か?

エラーとは、プログラムが正常に動作しない状態を指します。大きく分けて以下の3つのカテゴリーがあります:

  1. 構文エラー(Syntax Error):文法の間違い
  2. 実行時エラー(Runtime Error):実行中に発生するエラー
  3. 論理エラー(Logical Error):プログラムは動くが、期待した結果にならない

1. 構文エラー(Syntax Error)

特徴

  • コードの文法規則に違反している
  • プログラムが実行される前に検出される
  • 比較的見つけやすい

よくある例と対処法

1) 括弧の閉じ忘れ

// 間違った例
function calculateSum(a, b {
  return a + b;
}

// 正しい例
function calculateSum(a, b) {
  return a + b;
}

対処法

  • エディタの括弧の強調表示機能を活用する
  • コードを整形する(インデント)
  • 括弧を書くときは閉じ括弧まで先に書く

2) セミコロンの付け忘れ

// 間違った例
let name = "太郎"
console.log(name)

// 正しい例
let name = "太郎";
console.log(name);

対処法

  • 自動フォーマッターを使用する
  • 文の終わりには必ずセミコロンを付ける習慣をつける

3) スペルミス

// 間違った例
cosole.log("Hello");  // console が間違っている

// 正しい例
console.log("Hello");

対処法

  • コード補完機能を活用する
  • エディタの警告に注意を払う
  • 正しいスペルを覚える

2. 実行時エラー(Runtime Error)

特徴

  • プログラムの実行中に発生する
  • 予期しないデータや状況で発生することがある
  • デバッグが必要な場合が多い

よくある例と対処法

1) TypeError(型エラー)

// エラーの例
let text = "Hello";
text.push("World");  // 文字列に配列のメソッドを使用している

// 正しい例
let text = "Hello";
text = text + " World";  // または
text += " World";

対処法

  • 変数の型を確認する(typeof 演算子を使用)
  • その型で使用できるメソッドを確認する
  • 型変換が必要か検討する

2) ReferenceError(参照エラー)

// エラーの例
console.log(undefinedVariable);  // 定義されていない変数を使用

// 正しい例
let definedVariable = "Hello";
console.log(definedVariable);

対処法

  • 変数が定義されているか確認する
  • スコープを確認する
  • 変数名のタイプミスをチェックする

3) RangeError(範囲エラー)

// エラーの例
let arr = new Array(-1);  // 配列のサイズに負の数を指定

// 正しい例
let arr = new Array(5);  // 正の整数を指定

対処法

  • 値が適切な範囲内かチェックする
  • 境界値のテストを行う
  • 入力値のバリデーションを実装する

3. 論理エラー(Logical Error)

特徴

  • プログラムは動くが、期待した結果にならない
  • 発見が最も難しい
  • デバッグに時間がかかることが多い

よくある例と対処法

1) 計算の順序の間違い

// 間違った例(平均値の計算)
let scores = [80, 90, 75];
let average = scores[0] + scores[1] + scores[2] / 3;  // 75を3で割ってから加算している

// 正しい例
let average = (scores[0] + scores[1] + scores[2]) / 3;  // 全ての合計を3で割る

対処法

  • 計算式を紙に書いて確認する
  • 小さな値でテストする
  • 括弧を使って計算の順序を明確にする

2) 条件式の論理の誤り

// 間違った例(18歳以上AND20歳未満をチェックしたい場合)
if (age >= 18 || age < 20) {  // OR演算子を使っている
  console.log("対象年齢です");
}

// 正しい例
if (age >= 18 && age < 20) {  // AND演算子を使う
  console.log("対象年齢です");
}

対処法

  • 条件式を日本語で書き出してみる
  • 境界値でテストする
  • 真理値表を作成する

3) 無限ループ

// 間違った例
let i = 0;
while (i < 10) {
  console.log(i);
  // iをインクリメントし忘れている
}

// 正しい例
let i = 0;
while (i < 10) {
  console.log(i);
  i++;  // ループ変数を更新
}

対処法

  • ループの終了条件を確認する
  • ループ変数が適切に更新されているか確認する
  • 最大繰り返し回数を設定する

エラーの効率的な対処方法

1. エラーメッセージを読む

エラーメッセージには重要な情報が含まれています:

TypeError: Cannot read property 'name' of undefined
    at Object.<anonymous> (/path/to/file.js:10:20)

このエラーメッセージから分かること:

  • エラーの種類:TypeError
  • 問題の内容:undefinedのプロパティにアクセスしようとした
  • 発生場所:file.jsの10行目、20文字目

2. コンソールログを活用する

function calculateTotal(price, quantity) {
  console.log('Price:', price);  // 入力値の確認
  console.log('Quantity:', quantity);
  
  let total = price * quantity;
  console.log('Total before tax:', total);  // 中間結果の確認
  
  let tax = total * 0.1;
  console.log('Tax:', tax);
  
  total += tax;
  console.log('Final total:', total);  // 最終結果の確認
  
  return total;
}

3. デバッガーを使用する

function complexCalculation(a, b) {
  debugger;  // ここでプログラムが一時停止する
  
  let result = 0;
  for (let i = 0; i < a; i++) {
    result += i * b;
  }
  
  return result;
}

4. エラーを予防するベストプラクティス

入力値の検証

function divide(a, b) {
  // 引数の型をチェック
  if (typeof a !== 'number' || typeof b !== 'number') {
    throw new Error('引数は数値である必要があります');
  }
  
  // ゼロ除算を防ぐ
  if (b === 0) {
    throw new Error('0で除算することはできません');
  }
  
  return a / b;
}

try-catch文の使用

try {
  let result = divide(10, 0);
  console.log(result);
} catch (error) {
  console.error('エラーが発生しました:', error.message);
  // エラーの適切な処理を行う
} finally {
  // 必ず実行したい処理
  console.log('計算処理を終了します');
}

エラー対処のためのツール

1. 開発者ツール(Developer Tools)

ブラウザの開発者ツールを使用すると:

  • エラーメッセージの詳細確認
  • コンソールログの表示
  • ブレークポイントの設定
  • ネットワークリクエストの監視
    が可能です。

2. リンター(Linter)

ESLintなどのリンターを使用すると:

  • 構文エラーの早期発見
  • コーディング規約の遵守
  • 潜在的な問題の指摘
    ができます。
// .eslintrc.js の設定例
module.exports = {
  "rules": {
    "semi": ["error", "always"],  // セミコロンの必須化
    "no-unused-vars": "warn",     // 未使用変数の警告
    "eqeqeq": "error"            // 厳密等価演算子の使用を強制
  }
};

3. 型チェック

TypeScriptを使用すると、多くのエラーを事前に防ぐことができます:

// TypeScriptの例
function greet(name: string): string {
  return `Hello, ${name}!`;
}

greet(42);  // コンパイルエラー:数値は文字列型に割り当てられません

まとめ

プログラミングにおけるエラーは避けられませんが、以下の点を意識することで効率的に対処できます:

  1. エラーメッセージをよく読む
  2. デバッグツールを活用する
  3. コードを小さな単位でテストする
  4. エラーの種類と対処法を理解する
  5. 予防的な措置を講じる

エラーに遭遇したときは、慌てずに一つずつ確認していくことが重要です。エラーメッセージは私たちにヒントを与えてくれる良き先生だと考えて、前向きに取り組んでいきましょう。

次のステップ

エラー対処の基本を理解したら、以下の記事も参考にしてください:

Discussion