VB のたまご

作成日: 2015/12/03, 更新日: 2015/12/03


OverflowException について

概要

  •  OverflowException は、数値計算した結果、使用中の変数では扱えない大きさ(小ささ)になった場合に、発生する例外エラーです。 数値計算の結果の値について、考えられる範囲の数値を格納できる、適切な型に管理を変更することが、解決の糸口につながります。


スポンサーリンク


事例と対処方法

  •  以下のサンプルは、意図的に例外エラーを発生させるコードです。 実際の業務プログラムでは、このような簡単なコードではないと思いますが、例外発生させている、直接的な原因となる部分として参考になるはずです。 また、本例外エラーが発生してしまう原因となった、根本的な原因となる別の例外エラーが、さらに奥深くにいる場合があります。 (本例外エラーは間接的に影響を受けて発生してしまったもので、本当の原因となる例外エラーを食い止めることで、本例外エラーも直る場合があります。)

  •  このような組み合わせのパターンは、本例外エラーに限らず、他の例外エラー全般にも言えることですが、そんなに頻繁に出くわすものではないと思いますので、 そういう場合もあるということだけ、覚えておいていただけると解決しやすくなるのではと思います。

  •  また、記載の対処方法は、あくまでも一例です。 他の対処方法の方が、その業務プログラムにとってベストプラクティスとなる場合もありますので、検討材料の1つという程度に確認していただければと思います。

  • スポンサーリンク



  • Integer、その1
  • Dim i1 As Integer = Integer.MinValue
    i1 = i1 - 1
    
    ' 例外エラー
    System.OverflowException: 算術演算の結果オーバーフローが発生しました。
    
    ' 対処方法1
    Dim d1 As Decimal = Integer.MinValue
    d1 = d1 - 1
    
    ' 対処方法2
    Dim i1 As Integer = Integer.MinValue
    If Integer.MinValue < i1 Then
        i1 = i1 - 1
    End If
    
  •  現在の型よりも大きいサイズの型に変更することで、オーバーフローを防げます。 ただし、大きいサイズの型であっても、扱う数値によってはオーバーフローは発生しますので、扱う範囲に収まる、適切な数値の大きさを考慮することが重要です。 どうしても現在の型を扱いたい場合は、現在値と境界値の比較チェックを実施して、収まる値の場合のみ計算するようにします。


  • Integer、その2
  • Dim i1 As Integer = Integer.MaxValue
    i1 = i1 + 1
    
    ' 例外エラー
    System.OverflowException: 算術演算の結果オーバーフローが発生しました。
    
    ' 対処方法
    前の対処方法と同様
    
  •  前の対処方法と同様です。Integer 型の他、Byte、Short、Decimal、Long の型でも同様に例外エラーが発生します。 この場合も対処方法は同様です。


  • Decimal
  • Dim d1 As Decimal = Decimal.MinValue
    d1 = d1 - 1
    
    ' 例外エラー
    System.OverflowException: Decimal 型の値が大きすぎるか、または小さすぎます。
       場所 System.Decimal.FCallAddSub(Decimal& d1, Decimal& d2, Byte bSign)
       場所 System.Decimal.Subtract(Decimal d1, Decimal d2)
    
    ' 対処方法
    前の対処方法と同様
    
  •  Decimal 型の場合、メッセージが違いますが、同じ内容を指摘しています。


  • CType
  • Dim o1 As Object = Long.MaxValue
    Dim i1 As Integer = CType(o1, Integer)
    ' または
    Dim l1 As Long = Long.MaxValue
    Dim i1 As Integer = CType(l1, Integer)
    
    ' 例外エラー
    System.OverflowException: 算術演算の結果オーバーフローが発生しました。
       場所 Microsoft.VisualBasic.CompilerServices.Conversions.ToInteger(Object Value)
    
    ' 対処方法
    Dim o1 As Object = Long.MaxValue
    Dim d1 As Double = CType(o1, Double)
    ' または
    Dim l1 As Long = Long.MaxValue
    Dim d1 As Double = CType(l1, Double)
    
  •  数値型の型変換時も、値がまずければ例外エラーが発生します。変換後の数値型が、扱える数字であることを確認します。

  •  最後までこの記事を読んでいただき、ありがとうございました。

  • スポンサーリンク