172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes/*
272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes * Copyright (C) 2012 The Android Open Source Project
372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes *
472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes * you may not use this file except in compliance with the License.
672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes * You may obtain a copy of the License at
772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes *
872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes *
1072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes * Unless required by applicable law or agreed to in writing, software
1172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
1272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes * See the License for the specific language governing permissions and
1472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes * limitations under the License.
1572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes */
1672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
1772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughesimport java.lang.reflect.Array;
1872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughesimport java.lang.reflect.Field;
1972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughesimport java.lang.reflect.Method;
2072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
2172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughespublic class Main {
2272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  public static void main(String[] args) throws Exception {
2372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    arrayAccess();
2472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    arrayStore();
2572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    classCast();
2672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    classNotFound();
276fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    negativeArraySize();
286fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    nullPointers();
2972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    reflection();
3072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    stringIndex();
3172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
3272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
3372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  private static void assertEquals(String expected, String actual) {
3472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    if (expected == null && actual == null) {
3572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      return;
3672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
3772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    if (expected != null && expected.equals(actual)) {
3872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      return;
3972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
4072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    throw new AssertionError("not equal\n" +
4172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes                                 "expected: " + expected + "\n" +
4272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes                                 "actual:   " + actual);
4372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
4472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
4572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  private static void fail() {
4672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    throw new AssertionError();
4772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
4872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
4972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  private static void arrayAccess() throws Exception {
5072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    byte[] bs = new byte[1];
5172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    double[] ds = new double[1];
5272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    Object[] os = new Object[1];
5372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
5472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // aput
5572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
5672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      bs[2] = 0;
5772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
5872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayIndexOutOfBoundsException ex) {
5972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("length=1; index=2", ex.getMessage());
6072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
6172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
6272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // aget
6372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
6472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      byte b = bs[2];
6572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
6672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayIndexOutOfBoundsException ex) {
6772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("length=1; index=2", ex.getMessage());
6872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
6972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
7072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // aput-wide
7172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
7272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      ds[2] = 0.0;
7372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
7472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayIndexOutOfBoundsException ex) {
7572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("length=1; index=2", ex.getMessage());
7672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
7772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
7872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // aget-wide
7972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
8072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      double d = ds[2];
8172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
8272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayIndexOutOfBoundsException ex) {
8372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("length=1; index=2", ex.getMessage());
8472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
8572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
8672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // aput-object
8772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
8872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      os[2] = null;
8972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
9072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayIndexOutOfBoundsException ex) {
9172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("length=1; index=2", ex.getMessage());
9272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
9372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
9472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // aget-object
9572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
9672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object o = os[2];
9772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
9872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayIndexOutOfBoundsException ex) {
9972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("length=1; index=2", ex.getMessage());
10072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
10172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
10272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
10372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  private static void arrayStore() throws Exception {
10472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
10572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object[] array = new String[10];
10672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object o = new Exception();
10772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      array[0] = o;
10872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
10972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayStoreException ex) {
11072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("java.lang.Exception cannot be stored in an array of type java.lang.String[]",
11172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes                   ex.getMessage());
11272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
11372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
11472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
11572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object[] array = new C[10][];
11672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object o = new Integer(5);
11772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      array[0] = o;
11872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
11972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayStoreException ex) {
12072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("java.lang.Integer cannot be stored in an array of type Main$C[][]",
12172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes                   ex.getMessage());
12272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
12372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
12472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
12572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object[] array = new Float[10][];
12672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object o = new C[4];
12772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      array[0] = o;
12872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
12972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayStoreException ex) {
13072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("Main$C[] cannot be stored in an array of type java.lang.Float[][]",
13172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes                   ex.getMessage());
13272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
13372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
13472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
13572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      String[] src = new String[] { null, null, null, null, "hello", "goodbye" };
13672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Integer[] dst = new Integer[10];
13772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      System.arraycopy(src, 1, dst, 0, 5);
13872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayStoreException ex) {
13972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("source[4] of type java.lang.String cannot be stored in destination array of type java.lang.Integer[]",
14072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes                   ex.getMessage());
14172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
14272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
14372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
14472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      String[] src = new String[1];
14572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      int[] dst = new int[1];
14672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      System.arraycopy(src, 0, dst, 0, 1);
14772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayStoreException ex) {
14872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("Incompatible types: src=java.lang.String[], dst=int[]", ex.getMessage());
14972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
15072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
15172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
15272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      float[] src = new float[1];
15372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Runnable[] dst = new Runnable[1];
15472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      System.arraycopy(src, 0, dst, 0, 1);
15572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayStoreException ex) {
15672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("Incompatible types: src=float[], dst=java.lang.Runnable[]", ex.getMessage());
15772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
15872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
15972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
16072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      boolean[] src = new boolean[1];
16172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      double[][] dst = new double[1][];
16272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      System.arraycopy(src, 0, dst, 0, 1);
16372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayStoreException ex) {
16472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("Incompatible types: src=boolean[], dst=double[][]", ex.getMessage());
16572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
16672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
16772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
16872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      String src = "hello";
16972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object[] dst = new Object[1];
17072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      System.arraycopy(src, 0, dst, 0, 1);
17172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayStoreException ex) {
17272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("source of type java.lang.String is not an array", ex.getMessage());
17372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
17472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
17572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
17672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object[] src = new Object[1];
17772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Integer dst = new Integer(5);
17872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      System.arraycopy(src, 0, dst, 0, 1);
17972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayStoreException ex) {
18072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("destination of type java.lang.Integer is not an array", ex.getMessage());
18172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
18272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
18372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // This test demonstrates that the exception message complains
18472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // about the source in cases where neither source nor
18572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // destination is an array.
18672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
18772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      System.arraycopy(new C(), 0, "hello", 0, 1);
18872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ArrayStoreException ex) {
18972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("source of type Main$C is not an array", ex.getMessage());
19072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
19172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
19272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
19372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  private static void classCast() throws Exception {
19472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // Reference types.
19572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
19672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object o = new Exception();
19772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      String s = (String) o;
19872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
19972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ClassCastException ex) {
20072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("java.lang.Exception cannot be cast to java.lang.String", ex.getMessage());
20172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
20272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
20372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // Arrays of reference types.
20472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
20572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object o = (C) makeArray(String.class);
20672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
20772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ClassCastException ex) {
20872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("java.lang.String[] cannot be cast to Main$C", ex.getMessage());
20972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
21072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
21172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // Arrays of primitives.
21272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
21372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object o = (C) makeArray(float.class);
21472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
21572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ClassCastException ex) {
21672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("float[] cannot be cast to Main$C", ex.getMessage());
21772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
21872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
21972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // Multi-dimensional arrays of primitives.
22072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
22172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object o = (C) makeArray(char[].class);
22272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
22372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ClassCastException ex) {
22472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("char[][] cannot be cast to Main$C", ex.getMessage());
22572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
22672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
22772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // Multi-dimensional arrays of references.
22872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
22972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Object o = (Object[][][]) makeInteger();
23072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
23172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ClassCastException ex) {
23272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("java.lang.Integer cannot be cast to java.lang.Object[][][]", ex.getMessage());
23372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
23472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
23572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
23672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  static class C { }
23772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
23872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  /**
23972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes   * Helper for testCastOperator and testCastOperatorWithArrays. It's important that the
24072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes   * return type is Object, since otherwise the compiler will just reject the code.
24172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes   */
24272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  private static Object makeInteger() {
24372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    return new Integer(5);
24472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
24572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
24672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  /**
24772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes   * Helper for testCastOperatorWithArrays. It's important that
24872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes   * the return type is Object.
24972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes   */
250166aaee6aa39c20c87113b3fcf0dcd81e0a934cbAndreas Gampe  private static Object makeArray(Class<?> c) {
25172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    return Array.newInstance(c, 1);
25272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
25372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
25472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  private static void classNotFound() throws Exception {
25572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
25672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      // There is no such thing as an array of void.
25772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Class.forName("[V");
25872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
25972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ClassNotFoundException ex) {
26072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("Invalid name: [V", ex.getMessage());
26172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
26272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
26372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
26472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      // This class name is valid, but doesn't exist.
26572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Class.forName("package.Class");
26672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
26772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ClassNotFoundException ex) {
26872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("package.Class", ex.getMessage());
26972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
27072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
27172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
27272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      // This array class name is valid, but the type doesn't exist.
27372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Class.forName("[[Lpackage.Class;");
27472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
27572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (ClassNotFoundException ex) {
27672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("[[Lpackage.Class;", ex.getMessage());
27772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
27872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
27972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
2806fcce3092040f829afd68862091ce00c7661d8edElliott Hughes  private static void negativeArraySize() throws Exception {
2816fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
2826fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      int[] is = new int[-123];
2836fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
2846fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (NegativeArraySizeException ex) {
2856fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      assertEquals("-123", ex.getMessage());
2866fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
2876fcce3092040f829afd68862091ce00c7661d8edElliott Hughes  }
2886fcce3092040f829afd68862091ce00c7661d8edElliott Hughes
2892d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  // Defeat the fact that null's are untyped for precise detail message creation with quickening.
2902d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  private static Object returnNullObject() {
2912d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz    return null;
2922d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  }
2932d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz
2942d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  private static A returnNullA() {
2952d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz    return null;
2962d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz  }
2972d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz
2986fcce3092040f829afd68862091ce00c7661d8edElliott Hughes  private static void nullPointers() throws Exception {
2996fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    // Invoke method.
3006fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
3012d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz      Object o = returnNullObject();
3026fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      o.hashCode();
3036fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
3046fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (NullPointerException ex) {
3056fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      assertEquals("Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference", ex.getMessage());
3066fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
3076fcce3092040f829afd68862091ce00c7661d8edElliott Hughes
3086fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    // Read field.
3096fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
3102d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz      A a = returnNullA();
3116fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      int i = a.i;
3126fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
3136fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (NullPointerException ex) {
3146fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      assertEquals("Attempt to read from field 'int A.i' on a null object reference", ex.getMessage());
3156fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
3166fcce3092040f829afd68862091ce00c7661d8edElliott Hughes
3176fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    // Write field.
3186fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
3192d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz      A a = returnNullA();
3206fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      a.i = 1;
3216fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
3226fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (NullPointerException ex) {
3236fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      assertEquals("Attempt to write to field 'int A.i' on a null object reference", ex.getMessage());
3246fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
3256fcce3092040f829afd68862091ce00c7661d8edElliott Hughes
3266fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    // Read array.
3276fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
3286fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      int[] is = null;
3296fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      int i = is[0];
3306fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
3316fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (NullPointerException ex) {
3326fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      assertEquals("Attempt to read from null array", ex.getMessage());
3336fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
3346fcce3092040f829afd68862091ce00c7661d8edElliott Hughes
3356fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    // Write array.
3366fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
3376fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      int[] is = null;
3386fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      is[0] = 1;
3396fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
3406fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (NullPointerException ex) {
3416fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      assertEquals("Attempt to write to null array", ex.getMessage());
3426fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
3436fcce3092040f829afd68862091ce00c7661d8edElliott Hughes
3442d6ba5158d7fd459db2870df47300b517dc4d08cSebastien Hertz    // Array length.
3456fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
3466fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      int[] is = null;
3476fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      int i = is.length;
3486fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
3496fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (NullPointerException ex) {
3506fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      assertEquals("Attempt to get length of null array", ex.getMessage());
3516fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
3526fcce3092040f829afd68862091ce00c7661d8edElliott Hughes  }
3536fcce3092040f829afd68862091ce00c7661d8edElliott Hughes
35472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  private static void reflection() throws Exception {
35572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // Can't assign Integer to a String field.
35672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
35772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Field field = A.class.getField("b");
35872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      field.set(new A(), 5);
35972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
36072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (IllegalArgumentException expected) {
361848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao      assertEquals("field A.b has type java.lang.String, got java.lang.Integer",
362848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao          expected.getMessage());
36372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
36472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
36572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // Can't unbox null to a primitive.
36672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
36772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Field field = A.class.getField("i");
36872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      field.set(new A(), null);
36972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
37072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (IllegalArgumentException expected) {
37172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("field A.i has type int, got null", expected.getMessage());
37272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
37372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
37472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // Can't unbox String to a primitive.
37572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
37672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Field field = A.class.getField("i");
37772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      field.set(new A(), "hello, world!");
37872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
37972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (IllegalArgumentException expected) {
38072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("field A.i has type int, got java.lang.String", expected.getMessage());
38172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
38272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
38372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // Can't pass an Integer as a String.
38472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
38572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Method m = A.class.getMethod("m", int.class, String.class);
38672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      m.invoke(new A(), 2, 2);
38772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
38872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (IllegalArgumentException expected) {
389848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao      assertEquals("method A.m argument 2 has type java.lang.String, got java.lang.Integer",
390848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao          expected.getMessage());
39172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
39272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
39372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // Can't pass null as an int.
39472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
39572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      Method m = A.class.getMethod("m", int.class, String.class);
39672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      m.invoke(new A(), null, "");
39772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
39872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (IllegalArgumentException expected) {
39972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("method A.m argument 1 has type int, got null", expected.getMessage());
40072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
4016fcce3092040f829afd68862091ce00c7661d8edElliott Hughes
4026fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
4036fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      Method m = String.class.getMethod("charAt", int.class);
4046fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      m.invoke("hello"); // Wrong number of arguments.
4056fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
4066fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (IllegalArgumentException iae) {
40762d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      assertEquals("Wrong number of arguments; expected 1, got 0", iae.getMessage());
4086fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
4096fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
4106fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      Method m = String.class.getMethod("charAt", int.class);
4116fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      m.invoke("hello", "world"); // Wrong type.
4126fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
4136fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (IllegalArgumentException iae) {
4143b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin      assertEquals("method java.lang.String.charAt argument 1 has type int, got java.lang.String",
415848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao          iae.getMessage());
4166fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
4176fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
4186fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      Method m = String.class.getMethod("charAt", int.class);
4196fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      m.invoke("hello", (Object) null); // Null for a primitive argument.
4206fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
4216fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (IllegalArgumentException iae) {
4223b6f440dbd066f03a737da6d292074f47b3fbc29Igor Murashkin      assertEquals("method java.lang.String.charAt argument 1 has type int, got null",
423848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao          iae.getMessage());
4246fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
4256fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
4266fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      Method m = String.class.getMethod("charAt", int.class);
4276fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      m.invoke(new Integer(5)); // Wrong type for 'this'.
4286fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
4296fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (IllegalArgumentException iae) {
430848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao      assertEquals("Expected receiver of type java.lang.String, but got java.lang.Integer",
431848f70a3d73833fc1bf3032a9ff6812e429661d9Jeff Hao          iae.getMessage());
4326fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
4336fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    try {
4346fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      Method m = String.class.getMethod("charAt", int.class);
4356fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      m.invoke(null); // Null for 'this'.
4366fcce3092040f829afd68862091ce00c7661d8edElliott Hughes      fail();
4376fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    } catch (NullPointerException npe) {
43862d6c772205b8859f0ebf7ad105402ec4c3e2e01Ian Rogers      assertEquals("null receiver", npe.getMessage());
4396fcce3092040f829afd68862091ce00c7661d8edElliott Hughes    }
44072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
44172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
44272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  private static void stringIndex() throws Exception {
44372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // charAt too small.
44472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
44572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      "hello".charAt(-1);
44672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
44772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (StringIndexOutOfBoundsException ex) {
44872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("length=5; index=-1", ex.getMessage());
44972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
45072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
45172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // charAt too big.
45272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
45372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      "hello".charAt(7);
45472e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
45572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (StringIndexOutOfBoundsException ex) {
45672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      assertEquals("length=5; index=7", ex.getMessage());
45772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
45872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
45972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    // substring too big.
46072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    try {
46172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      "hello there".substring(9,14);
46272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes      fail();
46372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    } catch (StringIndexOutOfBoundsException ex) {
4648ed949457f6c55a5386e4a3351d9806bc7cca555Roland Levillain      assertEquals("length=11; index=14", ex.getMessage());
46572e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes    }
46672e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  }
46772e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes}
46872e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes
46972e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughesclass A {
47072e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  public String b;
47172e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  public int i;
47272e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes  public void m(int i, String s) {}
47372e401c59bce47fdf0274a0d47f0340b05e4f27fElliott Hughes}
474