Index: classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/String2Test.java =================================================================== --- classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/String2Test.java (revision 935178) +++ classlib/modules/luni/src/test/api/common/org/apache/harmony/luni/tests/java/lang/String2Test.java (working copy) @@ -737,6 +737,33 @@ && (hw1.substring(5, 10).equals("World"))); assertTrue("not identical", hw1.substring(0, hw1.length()) == hw1); } + + /** + * @tests java.lang.String#substring(int, int) + */ + public void test_substringErrorMessage() { + try { + hw1.substring(-1, 1); + } catch (StringIndexOutOfBoundsException ex) { + String msg = ex.getMessage(); + assertTrue("Expected message to contain -1: " + msg, msg + .indexOf("-1") != -1); + } + try { + hw1.substring(4, 1); + } catch (StringIndexOutOfBoundsException ex) { + String msg = ex.getMessage(); + assertTrue("Expected message to contain -3: " + msg, msg + .indexOf("-3") != -1); + } + try { + hw1.substring(0, 100); + } catch (StringIndexOutOfBoundsException ex) { + String msg = ex.getMessage(); + assertTrue("Expected message to contain 100: " + msg, msg + .indexOf("100") != -1); + } + } /** * @tests java.lang.String#toCharArray() Index: classlib/modules/luni/src/main/java/java/lang/String.java =================================================================== --- classlib/modules/luni/src/main/java/java/lang/String.java (revision 935178) +++ classlib/modules/luni/src/main/java/java/lang/String.java (working copy) @@ -1405,12 +1405,17 @@ if (start == 0 && end == count) { return this; } - // NOTE last character not copied! - // Fast range check. - if (0 <= start && start <= end && end <= count) { - return new String(offset + start, end - start, value); + if (start < 0){ + throw new StringIndexOutOfBoundsException(start); } - throw new StringIndexOutOfBoundsException(); + else if (start > end){ + throw new StringIndexOutOfBoundsException(end-start); + } + else if (end > count){ + throw new StringIndexOutOfBoundsException(end); + } + // NOTE last character not copied! + return new String(offset + start, end - start, value); } /**