OverflowException について

初級者向けにおさらいします。

目次

この例外エラーの説明

主に、数値型のプリミティブ型を扱う際に発生します。計算した結果の値が、その数値型が管理できる範囲を超えてしまって、Overflow(変数に計算結果をセットすることができない状態により発生する)Exception です。

事例とその対処方法

例外エラーは、想定外の扱われ方をすると発生して飛んで来ます。それは命令の使い方が間違っていたり、存在しないデータを扱おうとしていたり、アカウント権限を越えたアクセスをしようとしていたり(Windows 側やウェブ側の話だったり)、サービスが動いていないのに連携しようとしたり、製品上の仕様考慮モレだったり、そういう系です。

こうなっている前提のはずだから、こうやろうとしたのに、実際はここがこうなっているからダメじゃん!こういう場合の処理が無いじゃん!みたいなコードになっていませんか?

Integer

例えば Integer は、-2,147,483,648 ~ 2,147,483,647 の範囲の数を扱うことができます。ということは、それよりも小さい値、または大きい値は扱えないことになります。

Dim i As Integer = Integer.MaxValue
i += 1
System.OverflowException: '算術演算の結果オーバーフローが発生しました。'

実際には、ほとんどが加減乗除の計算処理中に発生するものです。扱う数の大きさに合わせて、Byte, Decimal, Double で扱ったりすることでしょう。小数点を扱う際は、四捨五入や繰り上げ、繰り下げ、切り捨てなど、計算結果によって桁あふれする可能性があることにも注意です。

CType

型変換する際、大きい型から小さい型に変換する場合は注意が必要です。

Dim l As Long = Long.MaxValue
Dim i As Integer = CType(l, Integer)
System.OverflowException: '算術演算の結果オーバーフローが発生しました。'

変数の中身をチェックしたり、文字列であれば TryParse メソッドを利用したりします。ただ、わざわざ型変換する場面は少ないかもしれないですね。

Dim l As Long = Long.MaxValue
Dim i As Integer = 0

If l <= Integer.MaxValue Then
    i = CInt(l)
End If
Dim s As String = Long.MaxValue.ToString()
Dim i As Integer
If Integer.TryParse(s, i) Then
    ' 変換成功
    Console.WriteLine(i)
End If