diff --git a/base/source/c/copyByteTarget.ctempl b/base/source/c/copyByteTarget.ctempl
index 71cba8f7f6d1e45ecfd70931ac50cfb3ab909c5a..7d9b8d205bb2f8b0c6b678daa5621ce5f3e4ec7b 100644
--- a/base/source/c/copyByteTarget.ctempl
+++ b/base/source/c/copyByteTarget.ctempl
@@ -39,6 +39,7 @@ extern "C" {
 extern jboolean h5JNIFatalError( JNIEnv *env, char *functName);
 extern jboolean h5nullArgument( JNIEnv *env, char *functName);
 extern jboolean h5badArgument( JNIEnv *env, char *functName);
+extern jboolean h5indexOutOfBounds( JNIEnv *env, char *functName);
 
 /* Change byte order for data type of length 2. */
 #define CHANGE_BYTE_ORDER_2(ARRAY) {jbyte _tmp; _tmp=ARRAY[0]; ARRAY[0]=ARRAY[1]; ARRAY[1]=_tmp;}
@@ -97,7 +98,7 @@ JNIEXPORT void JNICALL FUNCTIONNAMETB
     inSize = (*env)->GetArrayLength(env, inData);
 #endif
     if ((inStart < 0) || (inStart + len > inSize)) {
-        h5badArgument(env, OOB_IN_ERR_TB);
+        h5indexOutOfBounds(env, OOB_IN_ERR_TB);
         return;
     }
 
@@ -107,7 +108,7 @@ JNIEXPORT void JNICALL FUNCTIONNAMETB
     outSize = (*env)->GetArrayLength(env, outData);
 #endif
     if ((outStart < 0) || (outStart + lenInBytes > outSize)) {
-        h5badArgument(env, OOB_OUT_ERR_TB);
+        h5indexOutOfBounds(env, OOB_OUT_ERR_TB);
         return;
     }
 
@@ -185,7 +186,7 @@ JNIEXPORT void JNICALL FUNCTIONNAMEBT
     inSize = (*env)->GetArrayLength(env, inData);
 #endif
     if ((inStart < 0) || (inStart + lenInBytes > inSize)) {
-        h5badArgument(env, OOB_IN_ERR_BT);
+        h5indexOutOfBounds(env, OOB_IN_ERR_BT);
         return;
     }
 
@@ -195,7 +196,7 @@ JNIEXPORT void JNICALL FUNCTIONNAMEBT
     outSize = (*env)->GetArrayLength(env, outData);
 #endif
     if ((outStart < 0) || (outStart + len > outSize)) {
-        h5badArgument(env, OOB_OUT_ERR_BT);
+        h5indexOutOfBounds(env, OOB_OUT_ERR_BT);
         return;
     }
 
diff --git a/base/source/c/copyCommon.c b/base/source/c/copyCommon.c
index 2c628232e17868e32e0892fffff1716448f25074..40a0278b7590e9c92ff55ef06d8ef7ab1eb50fcd 100755
--- a/base/source/c/copyCommon.c
+++ b/base/source/c/copyCommon.c
@@ -206,6 +206,63 @@ jboolean h5badArgument( JNIEnv *env, char *functName)
     return JNI_TRUE;
 }
 
+/*
+ *  An Index-out-of-bounds error argument in an HDF5 call
+ *  Create and throw an 'IllegalArgumentException'
+ *
+ *  Note:  This routine never returns from the 'throw',
+ *  and the Java native method immediately raises the
+ *  exception.
+ */
+jboolean h5indexOutOfBounds( JNIEnv *env, char *functName)
+{
+    jmethodID jm;
+    jclass jc;
+    char * args[2];
+    jobject ex;
+    jstring str;
+    int rval;
+
+#ifdef __cplusplus
+    jc = env->FindClass("java/lang/IndexOutOfBoundsException");
+#else
+    jc = (*env)->FindClass(env, "java/lang/IndexOutOfBoundsException");
+#endif
+    if (jc == NULL) {
+        return JNI_FALSE;
+    }
+#ifdef __cplusplus
+    jm = env->GetMethodID(jc, "<init>", "(Ljava/lang/String;)V");
+#else
+    jm = (*env)->GetMethodID(env, jc, "<init>", "(Ljava/lang/String;)V");
+#endif
+    if (jm == NULL) {
+        return JNI_FALSE;
+    }
+
+#ifdef __cplusplus
+    str = env->NewStringUTF(functName);
+#else
+    str = (*env)->NewStringUTF(env,functName);
+#endif
+    args[0] = (char *)str;
+    args[1] = 0;
+#ifdef __cplusplus
+    ex = env->NewObjectA ( jc, jm, (jvalue *)args );
+
+    rval = env->Throw((jthrowable) ex );
+#else
+    ex = (*env)->NewObjectA ( env, jc, jm, (jvalue *)args );
+
+    rval = (*env)->Throw(env, ex );
+#endif
+    if (rval < 0) {
+        fprintf(stderr, "FATAL ERROR:  BadArgument: Throw failed\n");
+        return JNI_FALSE;
+    }
+
+    return JNI_TRUE;
+}
 #ifdef __cplusplus
 }
 #endif