/* * Copyright (c) 1994, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package java.lang; /** * Thrown when an application attempts to use {@code null} in a * case where an object is required. These include: * *

* Applications should throw instances of this class to indicate * other illegal uses of the {@code null} object. * * {@code NullPointerException} objects may be constructed by the * virtual machine as if {@linkplain Throwable#Throwable(String, * Throwable, boolean, boolean) suppression were disabled and/or the * stack trace was not writable}. * * @author unascribed * @since 1.0 */ public class NullPointerException extends RuntimeException { @java.io.Serial private static final long serialVersionUID = 5162710183389028792L; /** * Constructs a {@code NullPointerException} with no detail message. */ public NullPointerException() { super(); } /** * Constructs a {@code NullPointerException} with the specified * detail message. * * @param s the detail message. */ public NullPointerException(String s) { super(s); } private static final String mustComputeExtendedNPEMessage = "1"; private static final String noExtendedNPEMessage = "2"; private volatile transient String extendedMessage; /** * {@inheritDoc} */ public synchronized Throwable fillInStackTrace() { // After the stack trace is changed the extended NPE algorithm // will compute a wrong message. So compute it beforehand. if (extendedMessage == null) { // The first call. Don't compute the message, we'll // do it lazily. extendedMessage = mustComputeExtendedNPEMessage; } else if (extendedMessage == mustComputeExtendedNPEMessage) { // The second call. extendedMessage = getExtendedNPEMessage(); } return super.fillInStackTrace(); } /** * Returns the detail message string of this throwable. * *

If a non-null message was supplied in a constructor it is * returned. Otherwise, an implementation specific message or * {@code null} is returned. * * @implNote * If no explicit message was passed to the constructor, and as * long as certain internal information is available, a verbose * description of the null reference is returned. * The internal information is not available in deserialized * NullPointerExceptions. * * @return the detail message string, which may be {@code null}. */ public String getMessage() { String message = super.getMessage(); if (message == null) { synchronized(this) { if (extendedMessage == mustComputeExtendedNPEMessage) { // Only the original stack trace was filled in. Message will // compute correctly. extendedMessage = getExtendedNPEMessage(); } if (extendedMessage != noExtendedNPEMessage) { return extendedMessage; } } } return message; } /** * Get an extended exception message. This returns a string describing * the location and cause of the exception. It returns noExtendedNPEMessage for * exceptions where this is not applicable. */ private String getExtendedNPEMessage() { String msg = getExtendedNPEMessage0(); if (msg == null) return noExtendedNPEMessage; return msg; } private native String getExtendedNPEMessage0(); }