1 /*
2  * Copyright (C) 2014 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 import java.lang.ref.WeakReference;
18 
19 /**
20  * Test that null pointer exceptions are thrown by the VM.
21  */
22 public class Main {
23   private int f;
main(String[] args)24   public static void main(String[] args) {
25     methodOne();
26   }
27 
methodOne()28   static void methodOne() {
29     methodTwo();
30   }
31 
callSpecial()32   private int callSpecial() {
33     return f;
34   }
35 
callFinal()36   final int callFinal() {
37     return f;
38   }
39 
methodTwo()40   static void methodTwo() {
41     NullPointerException npe = null;
42 
43     int thisLine = 43;
44 
45     new Object().getClass(); // Ensure compiled.
46     try {
47       ((Object) null).getClass();
48     } catch (NullPointerException e) {
49       npe = e;
50     }
51     check(npe, thisLine += 4);
52 
53     new Main().callSpecial();  // Ensure compiled.
54     try {
55       ((Main) null).callSpecial();  // Test invokespecial.
56     } catch (NullPointerException e) {
57       npe = e;
58     }
59     check(npe, thisLine += 8);
60 
61     new Main().callFinal();  // Ensure compiled.
62     try {
63       ((Main) null).callFinal();  // Test invokevirtual on final.
64     } catch (NullPointerException e) {
65       npe = e;
66     }
67     check(npe, thisLine += 8);
68 
69     try {
70       ((Value) null).objectField.toString();
71     } catch (NullPointerException e) {
72       npe = e;
73     }
74     check(npe, thisLine += 7);
75 
76     try {
77       useInt(((Value) null).intField);
78     } catch (NullPointerException e) {
79       npe = e;
80     }
81     check(npe, thisLine += 7);
82 
83     try {
84       useFloat(((Value) null).floatField);
85     } catch (NullPointerException e) {
86       npe = e;
87     }
88     check(npe, thisLine += 7);
89 
90     try {
91       useLong(((Value) null).longField);
92     } catch (NullPointerException e) {
93       npe = e;
94     }
95     check(npe, thisLine += 7);
96 
97     try {
98       useDouble(((Value) null).doubleField);
99     } catch (NullPointerException e) {
100       npe = e;
101     }
102     check(npe, thisLine += 7);
103 
104     try {
105       ((Value) null).objectField = "Fisk";
106     } catch (NullPointerException e) {
107       npe = e;
108     }
109     check(npe, thisLine += 7);
110 
111     try {
112       ((Value) null).intField = 42;
113     } catch (NullPointerException e) {
114       npe = e;
115     }
116     check(npe, thisLine += 7);
117 
118     try {
119       ((Value) null).floatField = 42.0F;
120     } catch (NullPointerException e) {
121       npe = e;
122     }
123     check(npe, thisLine += 7);
124 
125     try {
126       ((Value) null).longField = 42L;
127     } catch (NullPointerException e) {
128       npe = e;
129     }
130     check(npe, thisLine += 7);
131 
132     try {
133       ((Value) null).doubleField = 42.0d;
134     } catch (NullPointerException e) {
135       npe = e;
136     }
137     check(npe, thisLine += 7);
138 
139     try {
140       useInt(((Value) null).byteField);
141     } catch (NullPointerException e) {
142       npe = e;
143     }
144     check(npe, thisLine += 7);
145 
146     try {
147       if (((Value) null).booleanField) { }
148     } catch (NullPointerException e) {
149       npe = e;
150     }
151     check(npe, thisLine += 7);
152 
153     try {
154       useInt(((Value) null).charField);
155     } catch (NullPointerException e) {
156       npe = e;
157     }
158     check(npe, thisLine += 7);
159 
160     try {
161       useInt(((Value) null).shortField);
162     } catch (NullPointerException e) {
163       npe = e;
164     }
165     check(npe, thisLine += 7);
166 
167     try {
168       ((Value) null).byteField = 42;
169     } catch (NullPointerException e) {
170       npe = e;
171     }
172     check(npe, thisLine += 7);
173 
174     try {
175       ((Value) null).booleanField = true;
176     } catch (NullPointerException e) {
177       npe = e;
178     }
179     check(npe, thisLine += 7);
180 
181     try {
182       ((Value) null).charField = '\u0042';
183     } catch (NullPointerException e) {
184       npe = e;
185     }
186     check(npe, thisLine += 7);
187 
188     try {
189       ((Value) null).shortField = 42;
190     } catch (NullPointerException e) {
191       npe = e;
192     }
193     check(npe, thisLine += 7);
194 
195     try {
196       ((Value) null).volatileObjectField.toString();
197     } catch (NullPointerException e) {
198       npe = e;
199     }
200     check(npe, thisLine += 7);
201 
202     try {
203       ((Value) null).volatileObjectField = "Fisk";
204     } catch (NullPointerException e) {
205       npe = e;
206     }
207     check(npe, thisLine += 7);
208 
209     try {
210       useInt(((Value) null).volatileIntField);
211     } catch (NullPointerException e) {
212       npe = e;
213     }
214     check(npe, thisLine += 7);
215 
216     try {
217       ((Value) null).volatileIntField = 42;
218     } catch (NullPointerException e) {
219       npe = e;
220     }
221     check(npe, thisLine += 7);
222 
223     try {
224       useFloat(((Value) null).volatileFloatField);
225     } catch (NullPointerException e) {
226       npe = e;
227     }
228     check(npe, thisLine += 7);
229 
230     try {
231       ((Value) null).volatileFloatField = 42.0F;
232     } catch (NullPointerException e) {
233       npe = e;
234     }
235     check(npe, thisLine += 7);
236 
237     try {
238       useLong(((Value) null).volatileLongField);
239     } catch (NullPointerException e) {
240       npe = e;
241     }
242     check(npe, thisLine += 7);
243 
244     try {
245       ((Value) null).volatileLongField = 42L;
246     } catch (NullPointerException e) {
247       npe = e;
248     }
249     check(npe, thisLine += 7);
250 
251     try {
252       useDouble(((Value) null).volatileDoubleField);
253     } catch (NullPointerException e) {
254       npe = e;
255     }
256     check(npe, thisLine += 7);
257 
258     try {
259       ((Value) null).volatileDoubleField = 42.0d;
260     } catch (NullPointerException e) {
261       npe = e;
262     }
263     check(npe, thisLine += 7);
264 
265     try {
266       useInt(((Value) null).volatileByteField);
267     } catch (NullPointerException e) {
268       npe = e;
269     }
270     check(npe, thisLine += 7);
271 
272     try {
273       ((Value) null).volatileByteField = 42;
274     } catch (NullPointerException e) {
275       npe = e;
276     }
277     check(npe, thisLine += 7);
278 
279     try {
280       if (((Value) null).volatileBooleanField) { }
281     } catch (NullPointerException e) {
282       npe = e;
283     }
284     check(npe, thisLine += 7);
285 
286     try {
287       ((Value) null).volatileBooleanField = true;
288     } catch (NullPointerException e) {
289       npe = e;
290     }
291     check(npe, thisLine += 7);
292 
293     try {
294       useInt(((Value) null).volatileCharField);
295     } catch (NullPointerException e) {
296       npe = e;
297     }
298     check(npe, thisLine += 7);
299 
300     try {
301       ((Value) null).volatileCharField = '\u0042';
302     } catch (NullPointerException e) {
303       npe = e;
304     }
305     check(npe, thisLine += 7);
306 
307     try {
308       useInt(((Value) null).volatileShortField);
309     } catch (NullPointerException e) {
310       npe = e;
311     }
312     check(npe, thisLine += 7);
313 
314     try {
315       ((Value) null).volatileShortField = 42;
316     } catch (NullPointerException e) {
317       npe = e;
318     }
319     check(npe, thisLine += 7);
320 
321     try {
322       ((Object[]) null)[0].toString();
323     } catch (NullPointerException e) {
324       npe = e;
325     }
326     check(npe, thisLine += 7);
327 
328     try {
329       useInt(((int[]) null)[0]);
330     } catch (NullPointerException e) {
331       npe = e;
332     }
333     check(npe, thisLine += 7);
334 
335     try {
336       useFloat(((float[]) null)[0]);
337     } catch (NullPointerException e) {
338       npe = e;
339     }
340     check(npe, thisLine += 7);
341 
342     try {
343       useLong(((long[]) null)[0]);
344     } catch (NullPointerException e) {
345       npe = e;
346     }
347     check(npe, thisLine += 7);
348 
349     try {
350       useDouble(((double[]) null)[0]);
351     } catch (NullPointerException e) {
352       npe = e;
353     }
354     check(npe, thisLine += 7);
355 
356     try {
357       ((Object[]) null)[0] = "Fisk";
358     } catch (NullPointerException e) {
359       npe = e;
360     }
361     check(npe, thisLine += 7);
362 
363     try {
364       ((int[]) null)[0] = 42;
365     } catch (NullPointerException e) {
366       npe = e;
367     }
368     check(npe, thisLine += 7);
369 
370     try {
371       ((float[]) null)[0] = 42.0F;
372     } catch (NullPointerException e) {
373       npe = e;
374     }
375     check(npe, thisLine += 7);
376 
377     try {
378       ((long[]) null)[0] = 42L;
379     } catch (NullPointerException e) {
380       npe = e;
381     }
382     check(npe, thisLine += 7);
383 
384     try {
385       ((double[]) null)[0] = 42.0d;
386     } catch (NullPointerException e) {
387       npe = e;
388     }
389     check(npe, thisLine += 7);
390 
391     try {
392       useInt(((byte[]) null)[0]);
393     } catch (NullPointerException e) {
394       npe = e;
395     }
396     check(npe, thisLine += 7);
397 
398     try {
399       if (((boolean[]) null)[0]) { }
400     } catch (NullPointerException e) {
401       npe = e;
402     }
403     check(npe, thisLine += 7);
404 
405     try {
406       useInt(((char[]) null)[0]);
407     } catch (NullPointerException e) {
408       npe = e;
409     }
410     check(npe, thisLine += 7);
411 
412     try {
413       useInt(((short[]) null)[0]);
414     } catch (NullPointerException e) {
415       npe = e;
416     }
417     check(npe, thisLine += 7);
418 
419     try {
420       ((byte[]) null)[0] = 42;
421     } catch (NullPointerException e) {
422       npe = e;
423     }
424     check(npe, thisLine += 7);
425 
426     try {
427       ((boolean[]) null)[0] = true;
428     } catch (NullPointerException e) {
429       npe = e;
430     }
431     check(npe, thisLine += 7);
432 
433     try {
434       ((char[]) null)[0] = '\u0042';
435     } catch (NullPointerException e) {
436       npe = e;
437     }
438     check(npe, thisLine += 7);
439 
440     try {
441       ((short[]) null)[0] = 42;
442     } catch (NullPointerException e) {
443       npe = e;
444     }
445     check(npe, thisLine += 7);
446 
447     try {
448       useInt(((Object[]) null).length);
449     } catch (NullPointerException e) {
450       npe = e;
451     }
452     check(npe, thisLine += 7);
453 
454     try {
455       useInt(((int[]) null).length);
456     } catch (NullPointerException e) {
457       npe = e;
458     }
459     check(npe, thisLine += 7);
460 
461     try {
462       useInt(((float[]) null).length);
463     } catch (NullPointerException e) {
464       npe = e;
465     }
466     check(npe, thisLine += 7);
467 
468     try {
469       useInt(((long[]) null).length);
470     } catch (NullPointerException e) {
471       npe = e;
472     }
473     check(npe, thisLine += 7);
474 
475     try {
476       useInt(((double[]) null).length);
477     } catch (NullPointerException e) {
478       npe = e;
479     }
480     check(npe, thisLine += 7);
481 
482     try {
483       useInt(((byte[]) null).length);
484     } catch (NullPointerException e) {
485       npe = e;
486     }
487     check(npe, thisLine += 7);
488 
489     try {
490       useInt(((boolean[]) null).length);
491     } catch (NullPointerException e) {
492       npe = e;
493     }
494     check(npe, thisLine += 7);
495 
496     try {
497       useInt(((char[]) null).length);
498     } catch (NullPointerException e) {
499       npe = e;
500     }
501     check(npe, thisLine += 7);
502 
503     try {
504       useInt(((short[]) null).length);
505     } catch (NullPointerException e) {
506       npe = e;
507     }
508     check(npe, thisLine += 7);
509 
510     try {
511       Interface i = null;
512       i.methodInterface();  // Test null on invokeinterface.
513     } catch (NullPointerException e) {
514       npe = e;
515     }
516     check(npe, thisLine += 8);
517 
518     try {
519       Object o = null;
520       o.toString();  // Test null on invokevirtual.
521     } catch (NullPointerException e) {
522       npe = e;
523     }
524     check(npe, thisLine += 8);
525 
526     npe = null;
527     try {
528       String s = null;
529       try {
530         throw new AssertionError();
531       } finally {
532         // Cause an implicit NPE.
533         s.getClass();
534       }
535     } catch (NullPointerException e) {
536       npe = e;
537     }
538     check(npe, thisLine += 13);
539 
540     npe = null;
541     try {
542       String s = null;
543       try {
544         throw new AssertionError();
545       } catch (AssertionError ex) {
546       }
547       s.getClass();
548     } catch (NullPointerException e) {
549       npe = e;
550     }
551     check(npe, thisLine += 14);
552 
553     npe = null;
554     try {
555       useInt(((WeakReference<Object>) null).refersTo(null) ? 1 : 0);
556     } catch (NullPointerException e) {
557       npe = e;
558     }
559     check(npe, thisLine += 8);
560   }
561 
check(NullPointerException npe, int firstLine)562   static void check(NullPointerException npe, int firstLine) {
563     final boolean debug = false;
564     if (debug) {
565       System.out.print("Got to line ");
566       System.out.print(firstLine);
567       System.out.println();
568     }
569     StackTraceElement[] trace = npe.getStackTrace();
570     checkElement(trace[0], "Main", "methodTwo", "Main.java", firstLine);
571     checkElement(trace[1], "Main", "methodOne", "Main.java", 29);
572     checkElement(trace[2], "Main", "main", "Main.java", 25);
573   }
574 
checkElement(StackTraceElement element, String declaringClass, String methodName, String fileName, int lineNumber)575   static void checkElement(StackTraceElement element,
576                                   String declaringClass, String methodName,
577                                   String fileName, int lineNumber) {
578     assertEquals(declaringClass, element.getClassName());
579     assertEquals(methodName, element.getMethodName());
580     assertEquals(fileName, element.getFileName());
581     assertEquals(lineNumber, element.getLineNumber());
582   }
583 
assertEquals(Object expected, Object actual)584   static void assertEquals(Object expected, Object actual) {
585     if (!expected.equals(actual)) {
586       String msg = "Expected \"" + expected + "\" but got \"" + actual + "\"";
587       throw new AssertionError(msg);
588     }
589   }
590 
assertEquals(int expected, int actual)591   static void assertEquals(int expected, int actual) {
592     if (expected != actual) {
593       throw new AssertionError("Expected " + expected + " got " + actual);
594     }
595   }
596 
597   interface Interface {
methodInterface()598     void methodInterface();
599   }
600 
useInt(int i)601   static void useInt(int i) {
602   }
603 
useFloat(float f)604   static void useFloat(float f) {
605   }
606 
useDouble(double d)607   static void useDouble(double d) {
608   }
609 
useLong(long l)610   static void useLong(long l) {
611   }
612 
613   static class Value {
614     Object objectField;
615     int intField;
616     float floatField;
617     long longField;
618     double doubleField;
619     byte byteField;
620     boolean booleanField;
621     char charField;
622     short shortField;
623 
624     volatile Object volatileObjectField;
625     volatile int volatileIntField;
626     volatile float volatileFloatField;
627     volatile long volatileLongField;
628     volatile double volatileDoubleField;
629     volatile byte volatileByteField;
630     volatile boolean volatileBooleanField;
631     volatile char volatileCharField;
632     volatile short volatileShortField;
633   }
634 }
635