11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25 /**
26 * @test
27 * @key randomness
28 * @summary Test extended NullPointerException message for
29 * classfiles generated with debug information. In this case the name
30 * of the variable containing the array is printed.
31 * @bug 8218628
32 * @modules java.base/java.lang:open
33 * java.base/jdk.internal.org.objectweb.asm
34 * @library /test/lib
35 * @compile -g NullPointerExceptionTest.java
36 * @run main/othervm -XX:MaxJavaStackTraceDepth=1 -XX:+ShowCodeDetailsInExceptionMessages NullPointerExceptionTest hasDebugInfo
37 */
38 /**
39 * @test
40 * @key randomness
41 * @summary Test extended NullPointerException message for class
42 * files generated without debugging information. The message lists
43 * detailed information about the entity that is null.
44 * @bug 8218628
45 * @modules java.base/java.lang:open
46 * java.base/jdk.internal.org.objectweb.asm
47 * @library /test/lib
48 * @compile NullPointerExceptionTest.java
49 * @run main/othervm -XX:MaxJavaStackTraceDepth=1 -XX:+ShowCodeDetailsInExceptionMessages NullPointerExceptionTest
50 */
51
52 import java.io.ByteArrayInputStream;
53 import java.io.ByteArrayOutputStream;
54 import java.io.ObjectInputStream;
55 import java.io.ObjectOutputStream;
56 import java.lang.invoke.MethodHandles.Lookup;
57 import java.util.ArrayList;
58 import java.util.Random;
59
60 import jdk.internal.org.objectweb.asm.ClassWriter;
61 import jdk.internal.org.objectweb.asm.Label;
62 import jdk.internal.org.objectweb.asm.MethodVisitor;
63 import jdk.test.lib.Asserts;
64 import jdk.test.lib.Utils;
1264 "\"<local71>[<local70>][<local73>[<local65>][<local64>]][<local72>[<parameter63>][<parameter62>]" +
1265 "[<parameter47>]][<local72>[<local73>[<parameter33>][<parameter32>]][<parameter31>][<parameter17>]]\"") +
1266 " is null");
1267 }
1268 }
1269
1270
1271 public void testParameters() throws Exception {
1272 A a = new A();
1273 a.to_b = new B();
1274 testParametersTestMethod(a, 0.0, null, null);
1275 }
1276
1277
1278 public void testCreation() throws Exception {
1279 // If allocated with new, the message should not be generated.
1280 Asserts.assertNull(new NullPointerException().getMessage());
1281 String msg = new String("A pointless message");
1282 Asserts.assertTrue(new NullPointerException(msg).getMessage() == msg);
1283
1284 // If created via reflection, the message should not be generated.
1285 Exception ex = NullPointerException.class.getDeclaredConstructor().newInstance();
1286 Asserts.assertNull(ex.getMessage());
1287 }
1288
1289 public void testNative() throws Exception {
1290 // If NPE is thrown in a native method, the message should
1291 // not be generated.
1292 try {
1293 Class.forName(null);
1294 Asserts.fail();
1295 } catch (NullPointerException e) {
1296 Asserts.assertNull(e.getMessage());
1297 }
1298
1299 }
1300
1301 // Test we get the same message calling npe.getMessage() twice.
1302 @SuppressWarnings("null")
1303 public void testSameMessage() throws Exception {
1304 Object null_o = null;
1305 String expectedMsg =
|
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 */
24
25 /**
26 * @test
27 * @key randomness
28 * @summary Test extended NullPointerException message for
29 * classfiles generated with debug information. In this case the name
30 * of the variable containing the array is printed.
31 * @bug 8218628 8248476
32 * @modules java.base/java.lang:open
33 * java.base/jdk.internal.org.objectweb.asm
34 * @library /test/lib
35 * @compile -g NullPointerExceptionTest.java
36 * @run main/othervm -XX:MaxJavaStackTraceDepth=1 -XX:+ShowCodeDetailsInExceptionMessages NullPointerExceptionTest hasDebugInfo
37 */
38 /**
39 * @test
40 * @key randomness
41 * @summary Test extended NullPointerException message for class
42 * files generated without debugging information. The message lists
43 * detailed information about the entity that is null.
44 * @bug 8218628 8248476
45 * @modules java.base/java.lang:open
46 * java.base/jdk.internal.org.objectweb.asm
47 * @library /test/lib
48 * @compile NullPointerExceptionTest.java
49 * @run main/othervm -XX:MaxJavaStackTraceDepth=1 -XX:+ShowCodeDetailsInExceptionMessages NullPointerExceptionTest
50 */
51
52 import java.io.ByteArrayInputStream;
53 import java.io.ByteArrayOutputStream;
54 import java.io.ObjectInputStream;
55 import java.io.ObjectOutputStream;
56 import java.lang.invoke.MethodHandles.Lookup;
57 import java.util.ArrayList;
58 import java.util.Random;
59
60 import jdk.internal.org.objectweb.asm.ClassWriter;
61 import jdk.internal.org.objectweb.asm.Label;
62 import jdk.internal.org.objectweb.asm.MethodVisitor;
63 import jdk.test.lib.Asserts;
64 import jdk.test.lib.Utils;
1264 "\"<local71>[<local70>][<local73>[<local65>][<local64>]][<local72>[<parameter63>][<parameter62>]" +
1265 "[<parameter47>]][<local72>[<local73>[<parameter33>][<parameter32>]][<parameter31>][<parameter17>]]\"") +
1266 " is null");
1267 }
1268 }
1269
1270
1271 public void testParameters() throws Exception {
1272 A a = new A();
1273 a.to_b = new B();
1274 testParametersTestMethod(a, 0.0, null, null);
1275 }
1276
1277
1278 public void testCreation() throws Exception {
1279 // If allocated with new, the message should not be generated.
1280 Asserts.assertNull(new NullPointerException().getMessage());
1281 String msg = new String("A pointless message");
1282 Asserts.assertTrue(new NullPointerException(msg).getMessage() == msg);
1283
1284 // If the stack trace was set by the user, the message should not be
1285 // created.
1286 // This holds for explicitly crated NPEs, but also for implicilty
1287 // thrown ones.
1288 System.out.println(new NullPointerException().fillInStackTrace().getMessage());
1289 System.out.println(new NullPointerException(msg).fillInStackTrace().getMessage());
1290
1291 Asserts.assertNull(new NullPointerException().fillInStackTrace().getMessage());
1292 Asserts.assertTrue(new NullPointerException(msg).fillInStackTrace().getMessage() == msg);
1293
1294 NullPointerException ex = new NullPointerException();
1295 Throwable t = ex.fillInStackTrace();
1296
1297 Asserts.assertNull(t.getMessage());
1298
1299 ex = new NullPointerException(msg);
1300 t = ex.fillInStackTrace();
1301 Asserts.assertTrue(t.getMessage() == msg);
1302
1303 F f = null;
1304 try {
1305 f.i = 17;
1306 } catch (NullPointerException e) {
1307 checkMessage(e, "f.i = 17;", e.getMessage(),
1308 "Cannot assign field \"i\" because " +
1309 (hasDebugInfo ? "\"f\"" : "\"<local4>\"") + " is null");
1310 t = e.fillInStackTrace();
1311 }
1312 checkMessage(t, "e.fillInStackTrace()", t.getMessage(), null);
1313
1314 // Suppressing messages at fillInStackTrace also suppresses
1315 // the generated message if fillInStackTrace was called on null.
1316 ex = null;
1317 try {
1318 ex.fillInStackTrace();
1319 } catch (NullPointerException e) {
1320 // Without supressing the message we would see: 'Cannot invoke
1321 // "java.lang.NullPointerException.fillInStackTrace()" because "ex" is null'.
1322 checkMessage(e, "ex.fillInStackTrace()", e.getMessage(), null);
1323 }
1324
1325 // setStackTrace does not affect computing the message.
1326 // Message and stack trace won't match, though.
1327 F f1 = null;
1328 F f2 = null;
1329 NullPointerException e1 = null;
1330 NullPointerException e2 = null;
1331 try {
1332 f1.i = 18;
1333 } catch (NullPointerException e) {
1334 checkMessage(e, "f1.i = 18;", e.getMessage(),
1335 "Cannot assign field \"i\" because " +
1336 (hasDebugInfo ? "\"f1\"" : "\"<local5>\"") + " is null");
1337 e1 = e;
1338 }
1339 try {
1340 f2.i = 19;
1341 } catch (NullPointerException e) {
1342 checkMessage(e, "f2.i = 19;", e.getMessage(),
1343 "Cannot assign field \"i\" because " +
1344 (hasDebugInfo ? "\"f2\"" : "\"<local6>\"") + " is null");
1345 e2 = e;
1346 }
1347 e1.setStackTrace(e2.getStackTrace());
1348 checkMessage(e1, "f1.i = 18;", e1.getMessage(),
1349 "Cannot assign field \"i\" because " +
1350 (hasDebugInfo ? "\"f1\"" : "\"<local5>\"") + " is null");
1351
1352 // If created via reflection, the message should not be generated.
1353 ex = NullPointerException.class.getDeclaredConstructor().newInstance();
1354 Asserts.assertNull(ex.getMessage());
1355 }
1356
1357 public void testNative() throws Exception {
1358 // If NPE is thrown in a native method, the message should
1359 // not be generated.
1360 try {
1361 Class.forName(null);
1362 Asserts.fail();
1363 } catch (NullPointerException e) {
1364 Asserts.assertNull(e.getMessage());
1365 }
1366
1367 }
1368
1369 // Test we get the same message calling npe.getMessage() twice.
1370 @SuppressWarnings("null")
1371 public void testSameMessage() throws Exception {
1372 Object null_o = null;
1373 String expectedMsg =
|