1 /*
2 * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.lang;
27
28 /**
29 * Thrown when an application attempts to use {@code null} in a
30 * case where an object is required. These include:
31 * <ul>
32 * <li>Calling the instance method of a {@code null} object.
33 * <li>Accessing or modifying the field of a {@code null} object.
34 * <li>Taking the length of {@code null} as if it were an array.
35 * <li>Accessing or modifying the slots of {@code null} as if it
36 * were an array.
37 * <li>Throwing {@code null} as if it were a {@code Throwable}
38 * value.
39 * </ul>
40 * <p>
41 * Applications should throw instances of this class to indicate
42 * other illegal uses of the {@code null} object.
43 *
44 * {@code NullPointerException} objects may be constructed by the
45 * virtual machine as if {@linkplain Throwable#Throwable(String,
46 * Throwable, boolean, boolean) suppression were disabled and/or the
47 * stack trace was not writable}.
48 *
49 * @author unascribed
50 * @since 1.0
51 */
52 public
53 class NullPointerException extends RuntimeException {
54 private static final long serialVersionUID = 5162710183389028792L;
55
56 /**
57 * Constructs a {@code NullPointerException} with no detail message.
58 */
59 public NullPointerException() {
60 super();
61 }
62
63 /**
64 * Constructs a {@code NullPointerException} with the specified
65 * detail message.
66 *
67 * @param s the detail message.
68 */
69 public NullPointerException(String s) {
70 super(s);
71 }
72 }
|
1 /*
2 * Copyright (c) 1994, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package java.lang;
27
28 import java.lang.reflect.Field;
29
30 /**
31 * Thrown when an application attempts to use {@code null} in a
32 * case where an object is required. These include:
33 * <ul>
34 * <li>Calling the instance method of a {@code null} object.
35 * <li>Accessing or modifying the field of a {@code null} object.
36 * <li>Taking the length of {@code null} as if it were an array.
37 * <li>Accessing or modifying the slots of {@code null} as if it
38 * were an array.
39 * <li>Throwing {@code null} as if it were a {@code Throwable}
40 * value.
41 * </ul>
42 * <p>
43 * Applications should throw instances of this class to indicate
44 * other illegal uses of the {@code null} object.
45 *
46 * {@code NullPointerException} objects may be constructed by the
47 * virtual machine as if {@linkplain Throwable#Throwable(String,
48 * Throwable, boolean, boolean) suppression were disabled and/or the
49 * stack trace was not writable}.
50 *
51 * @author unascribed
52 * @since 1.0
53 */
54 public
55 class NullPointerException extends RuntimeException {
56 private static final long serialVersionUID = 5162710183389028792L;
57
58 /*
59 * If set a message describing the exception is computed when first calling
60 * getMessage(). A precise description of the location in the code and
61 * the entitiy being null will be computed. This message is stored in
62 * detailMessage and this flag is set to false.
63 */
64 private transient boolean lazyComputeMessage;
65
66 /**
67 * Constructs a {@code NullPointerException} with no detail message.
68 */
69 public NullPointerException() {
70 super();
71 lazyComputeMessage = true;
72 }
73
74 /**
75 * Constructs a {@code NullPointerException} with the specified
76 * detail message.
77 *
78 * @param s the detail message.
79 */
80 public NullPointerException(String s) {
81 super(s);
82 }
83
84 /**
85 * Returns the detail message string of this throwable.
86 *
87 * @return the detail message string of this {@code Throwable} instance
88 * (which may be {@code null}).
89 */
90 public String getMessage() {
91 synchronized (this) {
92 if (!lazyComputeMessage) {
93 return super.getMessage();
94 }
95 }
96
97 String extendedMessage = getExtendedNPEMessage(super.getMessage());
98
99 if (extendedMessage != null) {
100 synchronized (this) {
101 if (lazyComputeMessage) {
102 setMessage(extendedMessage);
103 lazyComputeMessage = false;
104 }
105 }
106 }
107
108 return extendedMessage;
109 }
110
111 // Install the extendedMessage in the Throwable.defaultMessage before
112 // serializing.
113 private Object writeReplace() {
114 getMessage();
115 return this;
116 }
117
118 // Get an extended exception message. This adds a string describing
119 // the location and cause of the exception. It returns defaultMessage
120 // for exceptions where this is not applicable.
121 private native String getExtendedNPEMessage(String defaultMessage);
122 }
|