blob: 9cd163f64fd09415d5603e3b4c744db82735e16f [file] [log] [blame]
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.lang.ref.WeakReference;
/**
* Test that null pointer exceptions are thrown by the VM.
*/
public class Main {
private int f;
public static void main(String[] args) {
methodOne();
}
static void methodOne() {
methodTwo();
}
private int callSpecial() {
return f;
}
final int callFinal() {
return f;
}
static void methodTwo() {
NullPointerException npe = null;
int thisLine = 43;
new Object().getClass(); // Ensure compiled.
try {
((Object) null).getClass();
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 4);
new Main().callSpecial(); // Ensure compiled.
try {
((Main) null).callSpecial(); // Test invokespecial.
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 8);
new Main().callFinal(); // Ensure compiled.
try {
((Main) null).callFinal(); // Test invokevirtual on final.
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 8);
try {
((Value) null).objectField.toString();
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((Value) null).intField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useFloat(((Value) null).floatField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useLong(((Value) null).longField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useDouble(((Value) null).doubleField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).objectField = "Fisk";
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).intField = 42;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).floatField = 42.0F;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).longField = 42L;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).doubleField = 42.0d;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((Value) null).byteField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
if (((Value) null).booleanField) { }
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((Value) null).charField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((Value) null).shortField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).byteField = 42;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).booleanField = true;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).charField = '\u0042';
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).shortField = 42;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).volatileObjectField.toString();
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).volatileObjectField = "Fisk";
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((Value) null).volatileIntField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).volatileIntField = 42;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useFloat(((Value) null).volatileFloatField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).volatileFloatField = 42.0F;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useLong(((Value) null).volatileLongField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).volatileLongField = 42L;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useDouble(((Value) null).volatileDoubleField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).volatileDoubleField = 42.0d;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((Value) null).volatileByteField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).volatileByteField = 42;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
if (((Value) null).volatileBooleanField) { }
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).volatileBooleanField = true;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((Value) null).volatileCharField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).volatileCharField = '\u0042';
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((Value) null).volatileShortField);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Value) null).volatileShortField = 42;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Object[]) null)[0].toString();
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((int[]) null)[0]);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useFloat(((float[]) null)[0]);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useLong(((long[]) null)[0]);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useDouble(((double[]) null)[0]);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((Object[]) null)[0] = "Fisk";
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((int[]) null)[0] = 42;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((float[]) null)[0] = 42.0F;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((long[]) null)[0] = 42L;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((double[]) null)[0] = 42.0d;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((byte[]) null)[0]);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
if (((boolean[]) null)[0]) { }
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((char[]) null)[0]);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((short[]) null)[0]);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((byte[]) null)[0] = 42;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((boolean[]) null)[0] = true;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((char[]) null)[0] = '\u0042';
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
((short[]) null)[0] = 42;
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((Object[]) null).length);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((int[]) null).length);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((float[]) null).length);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((long[]) null).length);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((double[]) null).length);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((byte[]) null).length);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((boolean[]) null).length);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((char[]) null).length);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
useInt(((short[]) null).length);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 7);
try {
Interface i = null;
i.methodInterface(); // Test null on invokeinterface.
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 8);
try {
Object o = null;
o.toString(); // Test null on invokevirtual.
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 8);
npe = null;
try {
String s = null;
try {
throw new AssertionError();
} finally {
// Cause an implicit NPE.
s.getClass();
}
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 13);
npe = null;
try {
String s = null;
try {
throw new AssertionError();
} catch (AssertionError ex) {
}
s.getClass();
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 14);
npe = null;
try {
useInt(((WeakReference<Object>) null).refersTo(null) ? 1 : 0);
} catch (NullPointerException e) {
npe = e;
}
check(npe, thisLine += 8);
}
static void check(NullPointerException npe, int firstLine) {
final boolean debug = false;
if (debug) {
System.out.print("Got to line ");
System.out.print(firstLine);
System.out.println();
}
StackTraceElement[] trace = npe.getStackTrace();
checkElement(trace[0], "Main", "methodTwo", "Main.java", firstLine);
checkElement(trace[1], "Main", "methodOne", "Main.java", 29);
checkElement(trace[2], "Main", "main", "Main.java", 25);
}
static void checkElement(StackTraceElement element,
String declaringClass, String methodName,
String fileName, int lineNumber) {
assertEquals(declaringClass, element.getClassName());
assertEquals(methodName, element.getMethodName());
assertEquals(fileName, element.getFileName());
assertEquals(lineNumber, element.getLineNumber());
}
static void assertEquals(Object expected, Object actual) {
if (!expected.equals(actual)) {
String msg = "Expected \"" + expected + "\" but got \"" + actual + "\"";
throw new AssertionError(msg);
}
}
static void assertEquals(int expected, int actual) {
if (expected != actual) {
throw new AssertionError("Expected " + expected + " got " + actual);
}
}
interface Interface {
void methodInterface();
}
static void useInt(int i) {
}
static void useFloat(float f) {
}
static void useDouble(double d) {
}
static void useLong(long l) {
}
static class Value {
Object objectField;
int intField;
float floatField;
long longField;
double doubleField;
byte byteField;
boolean booleanField;
char charField;
short shortField;
volatile Object volatileObjectField;
volatile int volatileIntField;
volatile float volatileFloatField;
volatile long volatileLongField;
volatile double volatileDoubleField;
volatile byte volatileByteField;
volatile boolean volatileBooleanField;
volatile char volatileCharField;
volatile short volatileShortField;
}
}