JAL-98 throw exception (unhandled) for int overthrow while counting
[jalview.git] / src / jalview / ext / android / SparseIntArray.java
index e286cb4..2b9c4af 100644 (file)
@@ -355,6 +355,8 @@ public class SparseIntArray implements Cloneable
    * @param key
    * @oparam toAdd
    * @return the new value of the count for the key
+   * @throw ArithmeticException if the result would exceed the maximum value of
+   *        an int
    */
   public int add(int key, int toAdd)
   {
@@ -362,6 +364,7 @@ public class SparseIntArray implements Cloneable
     int i = ContainerHelpers.binarySearch(mKeys, mSize, key);
     if (i >= 0)
     {
+      checkOverflow(mValues[i], toAdd);
       mValues[i] += toAdd;
       newValue = mValues[i];
     }
@@ -389,4 +392,34 @@ public class SparseIntArray implements Cloneable
     }
     return newValue;
   }
+
+  /**
+   * Throws ArithmeticException if adding addend to value would exceed the range
+   * of int
+   * 
+   * @param value
+   * @param addend
+   */
+  static void checkOverflow(int value, int addend)
+  {
+    /*
+     * test cases being careful to avoid overflow while testing!
+     */
+    if (addend > 0)
+    {
+      if (value > 0 && Integer.MAX_VALUE - value < addend)
+      {
+        throw new ArithmeticException("Integer overflow adding " + addend
+                + " to  " + value);
+      }
+    }
+    else if (addend < 0)
+    {
+      if (value < 0 && Integer.MIN_VALUE - value > addend)
+      {
+        throw new ArithmeticException("Integer underflow adding " + addend
+                + " to  " + value);
+      }
+    }
+  }
 }