C#
 Computer >> コンピューター >  >> プログラミング >> C#

【C#】FormatExceptionとは?発生原因と対処法をわかりやすく解説

FormatExceptionとは

C#におけるFormatExceptionは、メソッドに渡された引数の形式が不正である場合にスローされる例外です。特に、文字列を数値型などへ変換する処理において、変換できない形式の文字列が指定されたときによく発生します。

FormatExceptionが発生する例

例えば、int.Parse()メソッドは、引数として整数値を表す文字列を受け取ります。しかし、整数以外の値(小数点を含む数値やアルファベットなど)を渡すと、FormatExceptionがスローされます。

以下のコードを見てみましょう。

コード例

using System;
class Demo {
    static void Main() {
        string str = "3.5";
        int res = int.Parse(str);
    }
}

このプログラムでは、小数点を含む「3.5」という文字列をint.Parse()に渡しています。int型は整数のみを扱うため、この文字列は正しい形式とは言えません。

そのため、このプログラムを実行すると、次のようなエラーがスローされます。

実行結果(エラー)

Unhandled Exception:
System.FormatException: Input string was not in a correct format.

FormatExceptionへの対処法

FormatExceptionを回避するには、以下の方法が有効です。

1. TryParseメソッドを使用する

int.TryParse()を使用すると、変換に失敗しても例外がスローされず、戻り値で変換の成否を判定できます。ユーザー入力など不確定な文字列を扱う場合に特に推奨される方法です。

using System;
class Demo {
    static void Main() {
        string str = "3.5";
        if (int.TryParse(str, out int res)) {
            Console.WriteLine($"変換成功: {res}");
        } else {
            Console.WriteLine("整数に変換できません");
        }
    }
}

2. 事前に文字列の形式を検証する

string.IsNullOrEmpty()によるnull・空文字チェックや、正規表現を使った形式の検証を行ってから変換処理を実行することも、例外発生を防ぐ有効な手段です。

まとめ

FormatExceptionは、引数の形式が不正な場合に発生する例外です。特に文字列から数値への変換処理では頻繁に起こり得るため、TryParseメソッドの活用や事前の入力チェックを組み合わせて、安全で堅牢なコードを書くことを心がけましょう。

  1. C#の列挙型(Enum)とは?基本的な使い方をサンプルコード付きで解説

    C#における列挙型(Enum:Enumeration)は、曜日、月、季節、製品カテゴリなど、関連する一連の名前付き定数をひとつのグループとして格納するためのデータ型です。Enumの定数にはデフォルトで0から始まる整数値が自動的に割り当てられ、宣言された順番に1ずつ増加していきます。定数のセットは固定されており、ループ処理などで簡単に走査(トラバース)できるのも大きな特徴です。Enumの基本的な特徴関連する名前付き定数をひとまとめに管理できる最初の定数にはデフォルトで「0」が割り当てられ、以降は1ずつ増加する値は明示的に変更することも可能型安全性が高く、無効な値の代入をコンパイル時に防げるEnu

  2. C#で多重継承を実現する方法:インターフェースを使った実装ガイド

    C#における多重継承の基本C#では、クラスに対する多重継承(Multiple Inheritance)はサポートされていません。これは、複数の基底クラスを持つことで発生しうる曖昧性(いわゆる「ダイヤモンド継承問題」)を避けるための言語設計上の判断です。しかし、インターフェース(Interface)を利用することで、多重継承と同等の機能を実現できます。1つのクラスは複数のインターフェースを実装できるため、異なる機能を柔軟に組み合わせることが可能です。インターフェース「PaintCost」の定義まず、塗料コストを計算するためのインターフェース PaintCost を定義します。このインターフェース