xref: /aosp_15_r20/art/test/201-built-in-except-detail-messages/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2012 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Array;
18*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Field;
19*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Method;
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker public class Main {
main(String[] args)22*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) throws Exception {
23*795d594fSAndroid Build Coastguard Worker     arrayAccess();
24*795d594fSAndroid Build Coastguard Worker     arrayStore();
25*795d594fSAndroid Build Coastguard Worker     classCast();
26*795d594fSAndroid Build Coastguard Worker     classNotFound();
27*795d594fSAndroid Build Coastguard Worker     negativeArraySize();
28*795d594fSAndroid Build Coastguard Worker     nullPointers();
29*795d594fSAndroid Build Coastguard Worker     reflection();
30*795d594fSAndroid Build Coastguard Worker     stringIndex();
31*795d594fSAndroid Build Coastguard Worker   }
32*795d594fSAndroid Build Coastguard Worker 
assertEquals(String expected, String actual)33*795d594fSAndroid Build Coastguard Worker   private static void assertEquals(String expected, String actual) {
34*795d594fSAndroid Build Coastguard Worker     if (expected == null && actual == null) {
35*795d594fSAndroid Build Coastguard Worker       return;
36*795d594fSAndroid Build Coastguard Worker     }
37*795d594fSAndroid Build Coastguard Worker     if (expected != null && expected.equals(actual)) {
38*795d594fSAndroid Build Coastguard Worker       return;
39*795d594fSAndroid Build Coastguard Worker     }
40*795d594fSAndroid Build Coastguard Worker     throw new AssertionError("not equal\n" +
41*795d594fSAndroid Build Coastguard Worker                                  "expected: " + expected + "\n" +
42*795d594fSAndroid Build Coastguard Worker                                  "actual:   " + actual);
43*795d594fSAndroid Build Coastguard Worker   }
44*795d594fSAndroid Build Coastguard Worker 
fail()45*795d594fSAndroid Build Coastguard Worker   private static void fail() {
46*795d594fSAndroid Build Coastguard Worker     throw new AssertionError();
47*795d594fSAndroid Build Coastguard Worker   }
48*795d594fSAndroid Build Coastguard Worker 
arrayAccess()49*795d594fSAndroid Build Coastguard Worker   private static void arrayAccess() throws Exception {
50*795d594fSAndroid Build Coastguard Worker     byte[] bs = new byte[1];
51*795d594fSAndroid Build Coastguard Worker     double[] ds = new double[1];
52*795d594fSAndroid Build Coastguard Worker     Object[] os = new Object[1];
53*795d594fSAndroid Build Coastguard Worker 
54*795d594fSAndroid Build Coastguard Worker     // aput
55*795d594fSAndroid Build Coastguard Worker     try {
56*795d594fSAndroid Build Coastguard Worker       bs[2] = 0;
57*795d594fSAndroid Build Coastguard Worker       fail();
58*795d594fSAndroid Build Coastguard Worker     } catch (ArrayIndexOutOfBoundsException ex) {
59*795d594fSAndroid Build Coastguard Worker       assertEquals("length=1; index=2", ex.getMessage());
60*795d594fSAndroid Build Coastguard Worker     }
61*795d594fSAndroid Build Coastguard Worker 
62*795d594fSAndroid Build Coastguard Worker     // aget
63*795d594fSAndroid Build Coastguard Worker     try {
64*795d594fSAndroid Build Coastguard Worker       byte b = bs[2];
65*795d594fSAndroid Build Coastguard Worker       fail();
66*795d594fSAndroid Build Coastguard Worker     } catch (ArrayIndexOutOfBoundsException ex) {
67*795d594fSAndroid Build Coastguard Worker       assertEquals("length=1; index=2", ex.getMessage());
68*795d594fSAndroid Build Coastguard Worker     }
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker     // aput-wide
71*795d594fSAndroid Build Coastguard Worker     try {
72*795d594fSAndroid Build Coastguard Worker       ds[2] = 0.0;
73*795d594fSAndroid Build Coastguard Worker       fail();
74*795d594fSAndroid Build Coastguard Worker     } catch (ArrayIndexOutOfBoundsException ex) {
75*795d594fSAndroid Build Coastguard Worker       assertEquals("length=1; index=2", ex.getMessage());
76*795d594fSAndroid Build Coastguard Worker     }
77*795d594fSAndroid Build Coastguard Worker 
78*795d594fSAndroid Build Coastguard Worker     // aget-wide
79*795d594fSAndroid Build Coastguard Worker     try {
80*795d594fSAndroid Build Coastguard Worker       double d = ds[2];
81*795d594fSAndroid Build Coastguard Worker       fail();
82*795d594fSAndroid Build Coastguard Worker     } catch (ArrayIndexOutOfBoundsException ex) {
83*795d594fSAndroid Build Coastguard Worker       assertEquals("length=1; index=2", ex.getMessage());
84*795d594fSAndroid Build Coastguard Worker     }
85*795d594fSAndroid Build Coastguard Worker 
86*795d594fSAndroid Build Coastguard Worker     // aput-object
87*795d594fSAndroid Build Coastguard Worker     try {
88*795d594fSAndroid Build Coastguard Worker       os[2] = null;
89*795d594fSAndroid Build Coastguard Worker       fail();
90*795d594fSAndroid Build Coastguard Worker     } catch (ArrayIndexOutOfBoundsException ex) {
91*795d594fSAndroid Build Coastguard Worker       assertEquals("length=1; index=2", ex.getMessage());
92*795d594fSAndroid Build Coastguard Worker     }
93*795d594fSAndroid Build Coastguard Worker 
94*795d594fSAndroid Build Coastguard Worker     // aget-object
95*795d594fSAndroid Build Coastguard Worker     try {
96*795d594fSAndroid Build Coastguard Worker       Object o = os[2];
97*795d594fSAndroid Build Coastguard Worker       fail();
98*795d594fSAndroid Build Coastguard Worker     } catch (ArrayIndexOutOfBoundsException ex) {
99*795d594fSAndroid Build Coastguard Worker       assertEquals("length=1; index=2", ex.getMessage());
100*795d594fSAndroid Build Coastguard Worker     }
101*795d594fSAndroid Build Coastguard Worker   }
102*795d594fSAndroid Build Coastguard Worker 
arrayStore()103*795d594fSAndroid Build Coastguard Worker   private static void arrayStore() throws Exception {
104*795d594fSAndroid Build Coastguard Worker     try {
105*795d594fSAndroid Build Coastguard Worker       Object[] array = new String[10];
106*795d594fSAndroid Build Coastguard Worker       Object o = new Exception();
107*795d594fSAndroid Build Coastguard Worker       array[0] = o;
108*795d594fSAndroid Build Coastguard Worker       fail();
109*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException ex) {
110*795d594fSAndroid Build Coastguard Worker       assertEquals("java.lang.Exception cannot be stored in an array of type java.lang.String[]",
111*795d594fSAndroid Build Coastguard Worker                    ex.getMessage());
112*795d594fSAndroid Build Coastguard Worker     }
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker     try {
115*795d594fSAndroid Build Coastguard Worker       Object[] array = new C[10][];
116*795d594fSAndroid Build Coastguard Worker       Object o = new Integer(5);
117*795d594fSAndroid Build Coastguard Worker       array[0] = o;
118*795d594fSAndroid Build Coastguard Worker       fail();
119*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException ex) {
120*795d594fSAndroid Build Coastguard Worker       assertEquals("java.lang.Integer cannot be stored in an array of type Main$C[][]",
121*795d594fSAndroid Build Coastguard Worker                    ex.getMessage());
122*795d594fSAndroid Build Coastguard Worker     }
123*795d594fSAndroid Build Coastguard Worker 
124*795d594fSAndroid Build Coastguard Worker     try {
125*795d594fSAndroid Build Coastguard Worker       Object[] array = new Float[10][];
126*795d594fSAndroid Build Coastguard Worker       Object o = new C[4];
127*795d594fSAndroid Build Coastguard Worker       array[0] = o;
128*795d594fSAndroid Build Coastguard Worker       fail();
129*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException ex) {
130*795d594fSAndroid Build Coastguard Worker       assertEquals("Main$C[] cannot be stored in an array of type java.lang.Float[][]",
131*795d594fSAndroid Build Coastguard Worker                    ex.getMessage());
132*795d594fSAndroid Build Coastguard Worker     }
133*795d594fSAndroid Build Coastguard Worker 
134*795d594fSAndroid Build Coastguard Worker     try {
135*795d594fSAndroid Build Coastguard Worker       String[] src = new String[] { null, null, null, null, "hello", "goodbye" };
136*795d594fSAndroid Build Coastguard Worker       Integer[] dst = new Integer[10];
137*795d594fSAndroid Build Coastguard Worker       System.arraycopy(src, 1, dst, 0, 5);
138*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException ex) {
139*795d594fSAndroid Build Coastguard Worker       assertEquals("source[4] of type java.lang.String cannot be stored in destination array of type java.lang.Integer[]",
140*795d594fSAndroid Build Coastguard Worker                    ex.getMessage());
141*795d594fSAndroid Build Coastguard Worker     }
142*795d594fSAndroid Build Coastguard Worker 
143*795d594fSAndroid Build Coastguard Worker     try {
144*795d594fSAndroid Build Coastguard Worker       String[] src = new String[1];
145*795d594fSAndroid Build Coastguard Worker       int[] dst = new int[1];
146*795d594fSAndroid Build Coastguard Worker       System.arraycopy(src, 0, dst, 0, 1);
147*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException ex) {
148*795d594fSAndroid Build Coastguard Worker       assertEquals("Incompatible types: src=java.lang.String[], dst=int[]", ex.getMessage());
149*795d594fSAndroid Build Coastguard Worker     }
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker     try {
152*795d594fSAndroid Build Coastguard Worker       float[] src = new float[1];
153*795d594fSAndroid Build Coastguard Worker       Runnable[] dst = new Runnable[1];
154*795d594fSAndroid Build Coastguard Worker       System.arraycopy(src, 0, dst, 0, 1);
155*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException ex) {
156*795d594fSAndroid Build Coastguard Worker       assertEquals("Incompatible types: src=float[], dst=java.lang.Runnable[]", ex.getMessage());
157*795d594fSAndroid Build Coastguard Worker     }
158*795d594fSAndroid Build Coastguard Worker 
159*795d594fSAndroid Build Coastguard Worker     try {
160*795d594fSAndroid Build Coastguard Worker       boolean[] src = new boolean[1];
161*795d594fSAndroid Build Coastguard Worker       double[][] dst = new double[1][];
162*795d594fSAndroid Build Coastguard Worker       System.arraycopy(src, 0, dst, 0, 1);
163*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException ex) {
164*795d594fSAndroid Build Coastguard Worker       assertEquals("Incompatible types: src=boolean[], dst=double[][]", ex.getMessage());
165*795d594fSAndroid Build Coastguard Worker     }
166*795d594fSAndroid Build Coastguard Worker 
167*795d594fSAndroid Build Coastguard Worker     try {
168*795d594fSAndroid Build Coastguard Worker       String src = "hello";
169*795d594fSAndroid Build Coastguard Worker       Object[] dst = new Object[1];
170*795d594fSAndroid Build Coastguard Worker       System.arraycopy(src, 0, dst, 0, 1);
171*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException ex) {
172*795d594fSAndroid Build Coastguard Worker       assertEquals("source of type java.lang.String is not an array", ex.getMessage());
173*795d594fSAndroid Build Coastguard Worker     }
174*795d594fSAndroid Build Coastguard Worker 
175*795d594fSAndroid Build Coastguard Worker     try {
176*795d594fSAndroid Build Coastguard Worker       Object[] src = new Object[1];
177*795d594fSAndroid Build Coastguard Worker       Integer dst = new Integer(5);
178*795d594fSAndroid Build Coastguard Worker       System.arraycopy(src, 0, dst, 0, 1);
179*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException ex) {
180*795d594fSAndroid Build Coastguard Worker       assertEquals("destination of type java.lang.Integer is not an array", ex.getMessage());
181*795d594fSAndroid Build Coastguard Worker     }
182*795d594fSAndroid Build Coastguard Worker 
183*795d594fSAndroid Build Coastguard Worker     // This test demonstrates that the exception message complains
184*795d594fSAndroid Build Coastguard Worker     // about the source in cases where neither source nor
185*795d594fSAndroid Build Coastguard Worker     // destination is an array.
186*795d594fSAndroid Build Coastguard Worker     try {
187*795d594fSAndroid Build Coastguard Worker       System.arraycopy(new C(), 0, "hello", 0, 1);
188*795d594fSAndroid Build Coastguard Worker     } catch (ArrayStoreException ex) {
189*795d594fSAndroid Build Coastguard Worker       assertEquals("source of type Main$C is not an array", ex.getMessage());
190*795d594fSAndroid Build Coastguard Worker     }
191*795d594fSAndroid Build Coastguard Worker   }
192*795d594fSAndroid Build Coastguard Worker 
classCast()193*795d594fSAndroid Build Coastguard Worker   private static void classCast() throws Exception {
194*795d594fSAndroid Build Coastguard Worker     // Reference types.
195*795d594fSAndroid Build Coastguard Worker     try {
196*795d594fSAndroid Build Coastguard Worker       Object o = new Exception();
197*795d594fSAndroid Build Coastguard Worker       String s = (String) o;
198*795d594fSAndroid Build Coastguard Worker       fail();
199*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ex) {
200*795d594fSAndroid Build Coastguard Worker       assertEquals("java.lang.Exception cannot be cast to java.lang.String", ex.getMessage());
201*795d594fSAndroid Build Coastguard Worker     }
202*795d594fSAndroid Build Coastguard Worker 
203*795d594fSAndroid Build Coastguard Worker     // Arrays of reference types.
204*795d594fSAndroid Build Coastguard Worker     try {
205*795d594fSAndroid Build Coastguard Worker       Object o = (C) makeArray(String.class);
206*795d594fSAndroid Build Coastguard Worker       fail();
207*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ex) {
208*795d594fSAndroid Build Coastguard Worker       assertEquals("java.lang.String[] cannot be cast to Main$C", ex.getMessage());
209*795d594fSAndroid Build Coastguard Worker     }
210*795d594fSAndroid Build Coastguard Worker 
211*795d594fSAndroid Build Coastguard Worker     // Arrays of primitives.
212*795d594fSAndroid Build Coastguard Worker     try {
213*795d594fSAndroid Build Coastguard Worker       Object o = (C) makeArray(float.class);
214*795d594fSAndroid Build Coastguard Worker       fail();
215*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ex) {
216*795d594fSAndroid Build Coastguard Worker       assertEquals("float[] cannot be cast to Main$C", ex.getMessage());
217*795d594fSAndroid Build Coastguard Worker     }
218*795d594fSAndroid Build Coastguard Worker 
219*795d594fSAndroid Build Coastguard Worker     // Multi-dimensional arrays of primitives.
220*795d594fSAndroid Build Coastguard Worker     try {
221*795d594fSAndroid Build Coastguard Worker       Object o = (C) makeArray(char[].class);
222*795d594fSAndroid Build Coastguard Worker       fail();
223*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ex) {
224*795d594fSAndroid Build Coastguard Worker       assertEquals("char[][] cannot be cast to Main$C", ex.getMessage());
225*795d594fSAndroid Build Coastguard Worker     }
226*795d594fSAndroid Build Coastguard Worker 
227*795d594fSAndroid Build Coastguard Worker     // Multi-dimensional arrays of references.
228*795d594fSAndroid Build Coastguard Worker     try {
229*795d594fSAndroid Build Coastguard Worker       Object o = (Object[][][]) makeInteger();
230*795d594fSAndroid Build Coastguard Worker       fail();
231*795d594fSAndroid Build Coastguard Worker     } catch (ClassCastException ex) {
232*795d594fSAndroid Build Coastguard Worker       assertEquals("java.lang.Integer cannot be cast to java.lang.Object[][][]", ex.getMessage());
233*795d594fSAndroid Build Coastguard Worker     }
234*795d594fSAndroid Build Coastguard Worker   }
235*795d594fSAndroid Build Coastguard Worker 
236*795d594fSAndroid Build Coastguard Worker   static class C { }
237*795d594fSAndroid Build Coastguard Worker 
238*795d594fSAndroid Build Coastguard Worker   /**
239*795d594fSAndroid Build Coastguard Worker    * Helper for testCastOperator and testCastOperatorWithArrays. It's important that the
240*795d594fSAndroid Build Coastguard Worker    * return type is Object, since otherwise the compiler will just reject the code.
241*795d594fSAndroid Build Coastguard Worker    */
makeInteger()242*795d594fSAndroid Build Coastguard Worker   private static Object makeInteger() {
243*795d594fSAndroid Build Coastguard Worker     return new Integer(5);
244*795d594fSAndroid Build Coastguard Worker   }
245*795d594fSAndroid Build Coastguard Worker 
246*795d594fSAndroid Build Coastguard Worker   /**
247*795d594fSAndroid Build Coastguard Worker    * Helper for testCastOperatorWithArrays. It's important that
248*795d594fSAndroid Build Coastguard Worker    * the return type is Object.
249*795d594fSAndroid Build Coastguard Worker    */
makeArray(Class<?> c)250*795d594fSAndroid Build Coastguard Worker   private static Object makeArray(Class<?> c) {
251*795d594fSAndroid Build Coastguard Worker     return Array.newInstance(c, 1);
252*795d594fSAndroid Build Coastguard Worker   }
253*795d594fSAndroid Build Coastguard Worker 
classNotFound()254*795d594fSAndroid Build Coastguard Worker   private static void classNotFound() throws Exception {
255*795d594fSAndroid Build Coastguard Worker     try {
256*795d594fSAndroid Build Coastguard Worker       // There is no such thing as an array of void.
257*795d594fSAndroid Build Coastguard Worker       Class.forName("[V");
258*795d594fSAndroid Build Coastguard Worker       fail();
259*795d594fSAndroid Build Coastguard Worker     } catch (ClassNotFoundException ex) {
260*795d594fSAndroid Build Coastguard Worker       assertEquals("Invalid name: [V", ex.getMessage());
261*795d594fSAndroid Build Coastguard Worker     }
262*795d594fSAndroid Build Coastguard Worker 
263*795d594fSAndroid Build Coastguard Worker     try {
264*795d594fSAndroid Build Coastguard Worker       // This class name is valid, but doesn't exist.
265*795d594fSAndroid Build Coastguard Worker       Class.forName("package.Class");
266*795d594fSAndroid Build Coastguard Worker       fail();
267*795d594fSAndroid Build Coastguard Worker     } catch (ClassNotFoundException ex) {
268*795d594fSAndroid Build Coastguard Worker       assertEquals("package.Class", ex.getMessage());
269*795d594fSAndroid Build Coastguard Worker     }
270*795d594fSAndroid Build Coastguard Worker 
271*795d594fSAndroid Build Coastguard Worker     try {
272*795d594fSAndroid Build Coastguard Worker       // This array class name is valid, but the type doesn't exist.
273*795d594fSAndroid Build Coastguard Worker       Class.forName("[[Lpackage.Class;");
274*795d594fSAndroid Build Coastguard Worker       fail();
275*795d594fSAndroid Build Coastguard Worker     } catch (ClassNotFoundException ex) {
276*795d594fSAndroid Build Coastguard Worker       assertEquals("[[Lpackage.Class;", ex.getMessage());
277*795d594fSAndroid Build Coastguard Worker     }
278*795d594fSAndroid Build Coastguard Worker   }
279*795d594fSAndroid Build Coastguard Worker 
negativeArraySize()280*795d594fSAndroid Build Coastguard Worker   private static void negativeArraySize() throws Exception {
281*795d594fSAndroid Build Coastguard Worker     try {
282*795d594fSAndroid Build Coastguard Worker       int[] is = new int[-123];
283*795d594fSAndroid Build Coastguard Worker       fail();
284*795d594fSAndroid Build Coastguard Worker     } catch (NegativeArraySizeException ex) {
285*795d594fSAndroid Build Coastguard Worker       assertEquals("-123", ex.getMessage());
286*795d594fSAndroid Build Coastguard Worker     }
287*795d594fSAndroid Build Coastguard Worker   }
288*795d594fSAndroid Build Coastguard Worker 
289*795d594fSAndroid Build Coastguard Worker   // Defeat the fact that null's are untyped for precise detail message creation with quickening.
returnNullObject()290*795d594fSAndroid Build Coastguard Worker   private static Object returnNullObject() {
291*795d594fSAndroid Build Coastguard Worker     return null;
292*795d594fSAndroid Build Coastguard Worker   }
293*795d594fSAndroid Build Coastguard Worker 
returnNullA()294*795d594fSAndroid Build Coastguard Worker   private static A returnNullA() {
295*795d594fSAndroid Build Coastguard Worker     return null;
296*795d594fSAndroid Build Coastguard Worker   }
297*795d594fSAndroid Build Coastguard Worker 
nullPointers()298*795d594fSAndroid Build Coastguard Worker   private static void nullPointers() throws Exception {
299*795d594fSAndroid Build Coastguard Worker     // Invoke method.
300*795d594fSAndroid Build Coastguard Worker     try {
301*795d594fSAndroid Build Coastguard Worker       Object o = returnNullObject();
302*795d594fSAndroid Build Coastguard Worker       o.hashCode();
303*795d594fSAndroid Build Coastguard Worker       fail();
304*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException ex) {
305*795d594fSAndroid Build Coastguard Worker       assertEquals("Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference", ex.getMessage());
306*795d594fSAndroid Build Coastguard Worker     }
307*795d594fSAndroid Build Coastguard Worker 
308*795d594fSAndroid Build Coastguard Worker     // Read field.
309*795d594fSAndroid Build Coastguard Worker     try {
310*795d594fSAndroid Build Coastguard Worker       A a = returnNullA();
311*795d594fSAndroid Build Coastguard Worker       int i = a.i;
312*795d594fSAndroid Build Coastguard Worker       fail();
313*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException ex) {
314*795d594fSAndroid Build Coastguard Worker       assertEquals(
315*795d594fSAndroid Build Coastguard Worker           "Attempt to read from field 'int A.i' on a null object reference in method 'void Main.nullPointers()'",
316*795d594fSAndroid Build Coastguard Worker           ex.getMessage());
317*795d594fSAndroid Build Coastguard Worker     }
318*795d594fSAndroid Build Coastguard Worker 
319*795d594fSAndroid Build Coastguard Worker     // Write field.
320*795d594fSAndroid Build Coastguard Worker     try {
321*795d594fSAndroid Build Coastguard Worker       A a = returnNullA();
322*795d594fSAndroid Build Coastguard Worker       a.i = 1;
323*795d594fSAndroid Build Coastguard Worker       fail();
324*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException ex) {
325*795d594fSAndroid Build Coastguard Worker       assertEquals(
326*795d594fSAndroid Build Coastguard Worker           "Attempt to write to field 'int A.i' on a null object reference in method 'void Main.nullPointers()'",
327*795d594fSAndroid Build Coastguard Worker           ex.getMessage());
328*795d594fSAndroid Build Coastguard Worker     }
329*795d594fSAndroid Build Coastguard Worker 
330*795d594fSAndroid Build Coastguard Worker     // Read array.
331*795d594fSAndroid Build Coastguard Worker     try {
332*795d594fSAndroid Build Coastguard Worker       int[] is = null;
333*795d594fSAndroid Build Coastguard Worker       int i = is[0];
334*795d594fSAndroid Build Coastguard Worker       fail();
335*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException ex) {
336*795d594fSAndroid Build Coastguard Worker       assertEquals("Attempt to read from null array", ex.getMessage());
337*795d594fSAndroid Build Coastguard Worker     }
338*795d594fSAndroid Build Coastguard Worker 
339*795d594fSAndroid Build Coastguard Worker     // Write array.
340*795d594fSAndroid Build Coastguard Worker     try {
341*795d594fSAndroid Build Coastguard Worker       int[] is = null;
342*795d594fSAndroid Build Coastguard Worker       is[0] = 1;
343*795d594fSAndroid Build Coastguard Worker       fail();
344*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException ex) {
345*795d594fSAndroid Build Coastguard Worker       assertEquals("Attempt to write to null array", ex.getMessage());
346*795d594fSAndroid Build Coastguard Worker     }
347*795d594fSAndroid Build Coastguard Worker 
348*795d594fSAndroid Build Coastguard Worker     // Array length.
349*795d594fSAndroid Build Coastguard Worker     try {
350*795d594fSAndroid Build Coastguard Worker       int[] is = null;
351*795d594fSAndroid Build Coastguard Worker       int i = is.length;
352*795d594fSAndroid Build Coastguard Worker       fail();
353*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException ex) {
354*795d594fSAndroid Build Coastguard Worker       assertEquals("Attempt to get length of null array", ex.getMessage());
355*795d594fSAndroid Build Coastguard Worker     }
356*795d594fSAndroid Build Coastguard Worker   }
357*795d594fSAndroid Build Coastguard Worker 
reflection()358*795d594fSAndroid Build Coastguard Worker   private static void reflection() throws Exception {
359*795d594fSAndroid Build Coastguard Worker     // Can't assign Integer to a String field.
360*795d594fSAndroid Build Coastguard Worker     try {
361*795d594fSAndroid Build Coastguard Worker       Field field = A.class.getField("b");
362*795d594fSAndroid Build Coastguard Worker       field.set(new A(), 5);
363*795d594fSAndroid Build Coastguard Worker       fail();
364*795d594fSAndroid Build Coastguard Worker     } catch (IllegalArgumentException expected) {
365*795d594fSAndroid Build Coastguard Worker       assertEquals("field A.b has type java.lang.String, got java.lang.Integer",
366*795d594fSAndroid Build Coastguard Worker           expected.getMessage());
367*795d594fSAndroid Build Coastguard Worker     }
368*795d594fSAndroid Build Coastguard Worker 
369*795d594fSAndroid Build Coastguard Worker     // Can't unbox null to a primitive.
370*795d594fSAndroid Build Coastguard Worker     try {
371*795d594fSAndroid Build Coastguard Worker       Field field = A.class.getField("i");
372*795d594fSAndroid Build Coastguard Worker       field.set(new A(), null);
373*795d594fSAndroid Build Coastguard Worker       fail();
374*795d594fSAndroid Build Coastguard Worker     } catch (IllegalArgumentException expected) {
375*795d594fSAndroid Build Coastguard Worker       assertEquals("field A.i has type int, got null", expected.getMessage());
376*795d594fSAndroid Build Coastguard Worker     }
377*795d594fSAndroid Build Coastguard Worker 
378*795d594fSAndroid Build Coastguard Worker     // Can't unbox String to a primitive.
379*795d594fSAndroid Build Coastguard Worker     try {
380*795d594fSAndroid Build Coastguard Worker       Field field = A.class.getField("i");
381*795d594fSAndroid Build Coastguard Worker       field.set(new A(), "hello, world!");
382*795d594fSAndroid Build Coastguard Worker       fail();
383*795d594fSAndroid Build Coastguard Worker     } catch (IllegalArgumentException expected) {
384*795d594fSAndroid Build Coastguard Worker       assertEquals("field A.i has type int, got java.lang.String", expected.getMessage());
385*795d594fSAndroid Build Coastguard Worker     }
386*795d594fSAndroid Build Coastguard Worker 
387*795d594fSAndroid Build Coastguard Worker     // Can't pass an Integer as a String.
388*795d594fSAndroid Build Coastguard Worker     try {
389*795d594fSAndroid Build Coastguard Worker       Method m = A.class.getMethod("m", int.class, String.class);
390*795d594fSAndroid Build Coastguard Worker       m.invoke(new A(), 2, 2);
391*795d594fSAndroid Build Coastguard Worker       fail();
392*795d594fSAndroid Build Coastguard Worker     } catch (IllegalArgumentException expected) {
393*795d594fSAndroid Build Coastguard Worker       assertEquals("method A.m argument 2 has type java.lang.String, got java.lang.Integer",
394*795d594fSAndroid Build Coastguard Worker           expected.getMessage());
395*795d594fSAndroid Build Coastguard Worker     }
396*795d594fSAndroid Build Coastguard Worker 
397*795d594fSAndroid Build Coastguard Worker     // Can't pass null as an int.
398*795d594fSAndroid Build Coastguard Worker     try {
399*795d594fSAndroid Build Coastguard Worker       Method m = A.class.getMethod("m", int.class, String.class);
400*795d594fSAndroid Build Coastguard Worker       m.invoke(new A(), null, "");
401*795d594fSAndroid Build Coastguard Worker       fail();
402*795d594fSAndroid Build Coastguard Worker     } catch (IllegalArgumentException expected) {
403*795d594fSAndroid Build Coastguard Worker       assertEquals("method A.m argument 1 has type int, got null", expected.getMessage());
404*795d594fSAndroid Build Coastguard Worker     }
405*795d594fSAndroid Build Coastguard Worker 
406*795d594fSAndroid Build Coastguard Worker     try {
407*795d594fSAndroid Build Coastguard Worker       Method m = String.class.getMethod("charAt", int.class);
408*795d594fSAndroid Build Coastguard Worker       m.invoke("hello"); // Wrong number of arguments.
409*795d594fSAndroid Build Coastguard Worker       fail();
410*795d594fSAndroid Build Coastguard Worker     } catch (IllegalArgumentException iae) {
411*795d594fSAndroid Build Coastguard Worker       assertEquals("Wrong number of arguments; expected 1, got 0", iae.getMessage());
412*795d594fSAndroid Build Coastguard Worker     }
413*795d594fSAndroid Build Coastguard Worker     try {
414*795d594fSAndroid Build Coastguard Worker       Method m = String.class.getMethod("charAt", int.class);
415*795d594fSAndroid Build Coastguard Worker       m.invoke("hello", "world"); // Wrong type.
416*795d594fSAndroid Build Coastguard Worker       fail();
417*795d594fSAndroid Build Coastguard Worker     } catch (IllegalArgumentException iae) {
418*795d594fSAndroid Build Coastguard Worker       assertEquals("method java.lang.String.charAt argument 1 has type int, got java.lang.String",
419*795d594fSAndroid Build Coastguard Worker           iae.getMessage());
420*795d594fSAndroid Build Coastguard Worker     }
421*795d594fSAndroid Build Coastguard Worker     try {
422*795d594fSAndroid Build Coastguard Worker       Method m = String.class.getMethod("charAt", int.class);
423*795d594fSAndroid Build Coastguard Worker       m.invoke("hello", (Object) null); // Null for a primitive argument.
424*795d594fSAndroid Build Coastguard Worker       fail();
425*795d594fSAndroid Build Coastguard Worker     } catch (IllegalArgumentException iae) {
426*795d594fSAndroid Build Coastguard Worker       assertEquals("method java.lang.String.charAt argument 1 has type int, got null",
427*795d594fSAndroid Build Coastguard Worker           iae.getMessage());
428*795d594fSAndroid Build Coastguard Worker     }
429*795d594fSAndroid Build Coastguard Worker     try {
430*795d594fSAndroid Build Coastguard Worker       Method m = String.class.getMethod("charAt", int.class);
431*795d594fSAndroid Build Coastguard Worker       m.invoke(new Integer(5)); // Wrong type for 'this'.
432*795d594fSAndroid Build Coastguard Worker       fail();
433*795d594fSAndroid Build Coastguard Worker     } catch (IllegalArgumentException iae) {
434*795d594fSAndroid Build Coastguard Worker       assertEquals("Expected receiver of type java.lang.String, but got java.lang.Integer",
435*795d594fSAndroid Build Coastguard Worker           iae.getMessage());
436*795d594fSAndroid Build Coastguard Worker     }
437*795d594fSAndroid Build Coastguard Worker     try {
438*795d594fSAndroid Build Coastguard Worker       Method m = String.class.getMethod("charAt", int.class);
439*795d594fSAndroid Build Coastguard Worker       m.invoke(null); // Null for 'this'.
440*795d594fSAndroid Build Coastguard Worker       fail();
441*795d594fSAndroid Build Coastguard Worker     } catch (NullPointerException npe) {
442*795d594fSAndroid Build Coastguard Worker       assertEquals("null receiver", npe.getMessage());
443*795d594fSAndroid Build Coastguard Worker     }
444*795d594fSAndroid Build Coastguard Worker   }
445*795d594fSAndroid Build Coastguard Worker 
stringIndex()446*795d594fSAndroid Build Coastguard Worker   private static void stringIndex() throws Exception {
447*795d594fSAndroid Build Coastguard Worker     // charAt too small.
448*795d594fSAndroid Build Coastguard Worker     try {
449*795d594fSAndroid Build Coastguard Worker       "hello".charAt(-1);
450*795d594fSAndroid Build Coastguard Worker       fail();
451*795d594fSAndroid Build Coastguard Worker     } catch (StringIndexOutOfBoundsException ex) {
452*795d594fSAndroid Build Coastguard Worker       assertEquals("length=5; index=-1", ex.getMessage());
453*795d594fSAndroid Build Coastguard Worker     }
454*795d594fSAndroid Build Coastguard Worker 
455*795d594fSAndroid Build Coastguard Worker     // charAt too big.
456*795d594fSAndroid Build Coastguard Worker     try {
457*795d594fSAndroid Build Coastguard Worker       "hello".charAt(7);
458*795d594fSAndroid Build Coastguard Worker       fail();
459*795d594fSAndroid Build Coastguard Worker     } catch (StringIndexOutOfBoundsException ex) {
460*795d594fSAndroid Build Coastguard Worker       assertEquals("length=5; index=7", ex.getMessage());
461*795d594fSAndroid Build Coastguard Worker     }
462*795d594fSAndroid Build Coastguard Worker 
463*795d594fSAndroid Build Coastguard Worker     // substring too big.
464*795d594fSAndroid Build Coastguard Worker     try {
465*795d594fSAndroid Build Coastguard Worker       "hello there".substring(9,14);
466*795d594fSAndroid Build Coastguard Worker       fail();
467*795d594fSAndroid Build Coastguard Worker     } catch (StringIndexOutOfBoundsException ex) {
468*795d594fSAndroid Build Coastguard Worker       assertEquals("begin 9, end 14, length 11", ex.getMessage());
469*795d594fSAndroid Build Coastguard Worker     }
470*795d594fSAndroid Build Coastguard Worker   }
471*795d594fSAndroid Build Coastguard Worker }
472*795d594fSAndroid Build Coastguard Worker 
473*795d594fSAndroid Build Coastguard Worker class A {
474*795d594fSAndroid Build Coastguard Worker   public String b;
475*795d594fSAndroid Build Coastguard Worker   public int i;
m(int i, String s)476*795d594fSAndroid Build Coastguard Worker   public void m(int i, String s) {}
477*795d594fSAndroid Build Coastguard Worker }
478