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