/* * Copyright (c) 1994, 2020, 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}. * * @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); } // BEGIN Android-removed: no extended NPEs in Android. /* // 0: no backtrace filled in, no message computed. // 1: backtrace filled in, no message computed. // 2: message computed private transient int extendedMessageState; private transient String extendedMessage; /** * {@inheritDoc} * public synchronized Throwable fillInStackTrace() { // If the stack trace is changed the extended NPE algorithm // will compute a wrong message. So compute it beforehand. if (extendedMessageState == 0) { extendedMessageState = 1; } else if (extendedMessageState == 1) { extendedMessage = getExtendedNPEMessage(); extendedMessageState = 2; } 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 (extendedMessageState == 1) { // Only the original stack trace was filled in. Message will // compute correctly. extendedMessage = getExtendedNPEMessage(); extendedMessageState = 2; } return extendedMessage; } } return message; } /** * Get an extended exception message. This returns a string describing * the location and cause of the exception. It returns null for * exceptions where this is not applicable. * private native String getExtendedNPEMessage(); */ // END Android-removed: no extended NPEs in Android. }