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