【入門編】VB.NETのOverflowExceptionを防ぐCheckedとUncheckedコンテキスト:数値演算の限界を超える安全な計算処理 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは!エンジニアリングの世界へようこそ。
Excelのマクロ記録や簡単なVBAのカスタマイズから一歩踏み出し、「本格的なアプリケーションを作りたい!」とVB.NETに挑戦しているあなたへ。

今回は、プログラムの裏側でこっそり起こりがちな、しかし実務では致命傷になりかねない「数値のオーバーフロー(OverflowException)」と、それを華麗にコントロールする魔法のキーワード`Checked``Unchecked`について解説します。

ここをクリアすれば、数値計算の安全管理はバッチリです。一緒にプロのエンジニアの視点を手に入れましょう!

1. なぜ数値演算でエラーが起きるのか?(基本のキ)

私たちが普段何気なく使っているコンピューターの数値(整数型:`Integer`や`Long`など)には、それぞれ「入れられる器の大きさ(限界値)」が決まっています。

例えば、VB.NETの標準的な整数型である `Integer` 型(32ビット符号付き整数)が扱える限界は、以下の通りです。

  • 最大値: `2,147,483,647`
  • 最小値: `-2,147,483,648`

もし、この限界値に達している変数に、さらに `+ 1` を足そうとしたらどうなるでしょうか?
器から水があふれ出してしまうように、これが「オーバーフロー(Overflow)」です。

実際にエラーを起こしてみよう

以下のコードを見てください。

Sub TryOverflow()
Dim maxVal As Integer = Integer.MaxValue ‘ 2147483,647

‘ 限界値に 1 を足してみる
Dim result As Integer = maxVal + 1

Console.WriteLine(result)
End Sub

これを実行すると、VB.NETのデフォルトの設定では、エラー(`OverflowException`)でプログラムが強制終了するか、あるいは言語や設定によっては「おかしなマイナスの値」に化けてしまいます。
計算結果がサイレントにバグる(黙って間違った値になる)のが、エンジニアにとって一番怖い瞬間です。

2. 運命の分かれ道:Checked と Unchecked とは?

VB.NETには、このオーバーフローが発生したときに「どう振る舞うか」を明示的に指定するための構文が用意されています。それが `Checked``Unchecked` です。

  • `Checked` コンテキスト
  • 「絶対に計算ミスを許さない!」モード。
  • オーバーフローが発生した瞬間に、容赦なく `OverflowException`(例外) を発生させます。
  • 金銭計算や在庫管理など、1円の狂いも許されないクリティカルな処理で使います。
  • `Unchecked` コンテキスト(デフォルト)
  • 「スピード重視!細かいことは気にするな」モード。
  • オーバーフローが起きて値がラップアラウンド(一回転してマイナスになるなど)しても、例外を出さずにそのまま処理を続行します。
  • ゲームの座標計算や大量のピクセル処理など、パフォーマンスが命の場所で使われます。

3. 実践!コードで挙動の違いを体感しよう

百聞は一見に如かず。実際に `Checked` を使った安全なコードと、その書き方を見てみましょう。

Checked ブロックの書き方

VB.NETでは、`Checked (…)` のように式を囲むか、あるいはコードブロック全体を `Checked` で囲むことができます。

Imports System

Module OverflowDemo
Sub Main()
Dim maxVal As Integer = Integer.MaxValue

‘ 【1. Unchecked(通常の動作)】
‘ エラーは出ませんが、値がバグってマイナスになります(サイレントエラー)
Dim normalResult As Integer = maxVal + 1
Console.WriteLine(“Uncheckedの結果: ” & normalResult) ‘ 出力例: -2147483648

‘ 【2. Checked(安全重視)】
‘ 限界を超える計算を行おうとすると、即座に例外をキャッチできます
Try
Dim safeResult As Integer = Checked(maxVal + 1)
Console.WriteLine(“Checkedの結果: ” & safeResult)
Catch ex As OverflowException
Console.WriteLine(“【検知】オーバーフローが発生しました!処理を中断します: ” & ex.Message)
End Try

End Sub
End Module

コードの解説

  • `Checked(maxVal + 1)` の部分で、VB.NETは「この計算結果が `Integer` の枠内に収まるか?」を厳密にチェックします。
  • 収まらないと判断した瞬間、プログラムがクラッシュするのを防ぐため、`Try…Catch` 構文で安全にエラーを捕らえてメッセージを出力しています。

4. プロジェクト全体を「常にチェックする」設定にする方法

毎回コードの中に `Checked(…)` と書くのは面倒ですよね。
実は、Visual Studioのプロジェクト設定を変更することで、プロジェクト内のすべての整数演算をデフォルトで「Checked」にすることができます。

1. Visual Studioのソリューションエクスプローラーで、プロジェクト名を右クリックし、「プロパティ」を開きます。
2. 「コンパイル」タブ(または「詳細コンパイルオプション」)を開きます。
3. 「整数オーバーフローのチェック」 (Remove integer overflow checks) のチェックボックスを操作します。

  • チェックを入れると、プロジェクト全体でオーバーフローが監視されます(安全第一)。

ただし注意点として、すべての演算でチェックを行うと、わずかにパフォーマンスが低下する場合があります。そのため、ゲーム開発やリアルタイム処理などではデフォルト(Unchecked)のままにし、お金や数量を扱う重要な部分だけ `Checked` を明示的に使うのが、プロの現場でのスマートなテクニックです。

まとめ

今回は、VB.NETにおける数値演算の限界と、`Checked` / `Unchecked` による制御について解説しました。

  • 整数型には限界がある。 超えるとバグや例外の原因になる。
  • `Checked` を使うと、オーバーフローを検知して安全に例外を発生させられる。
  • 金銭や枚数など、絶対に間違えてはいけない計算には `Checked` を使うのがエンジニアのたしなみ。

「動けばいいや」のコードから、「安全性をコントロールできる」プロのコードへ。
この知識があれば、予期せぬ数値のバグに頭を悩ませることはもうありません。

ここをクリアしたあなたなら、もうマクロの記録の枠を超えた、立派なVB.NETエンジニアへの道を確実に歩んでいますよ。自信を持って次のステップへ進んでください!

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