为什么空引用打印为“null”

2023-12-13

在 println 中,这里 o.toString() 抛出 NPE,但 o1 不会。为什么?

public class RefTest {
    public static void main(String[] args) {
        Object o = null;
        Object o1 = null;
        System.out.println(o.toString()); //throws NPE
        System.out.print(o1); // does not throw NPE
    }
}

它可能有助于向您展示字节码。看看下面的内容javap你的班级的输出:

> javap -classpath target\test-classes -c RefTest

Compiled from "RefTest.java"
public class RefTest extends java.lang.Object{
public RefTest();
  Code:
   0:   aload_0
   1:   invokespecial   #8; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   aconst_null
   1:   astore_1
   2:   aconst_null
   3:   astore_2
   4:   getstatic       #17; //Field java/lang/System.out:Ljava/io/PrintStream;
   7:   aload_1
   8:   invokevirtual   #23; //Method java/lang/Object.toString:()Ljava/lang/String;
   11:  invokevirtual   #27; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
   14:  getstatic       #17; //Field java/lang/System.out:Ljava/io/PrintStream;
   17:  aload_2
   18:  invokevirtual   #33; //Method java/io/PrintStream.print:(Ljava/lang/Object;)V
   21:  return

}

只需查看 main 方法,您就可以看到感兴趣的行在哪里Code是 8 和 33。

代码 8 显示您调用的字节码o.toString(). Here o is null因此任何对方法调用的尝试null结果是NullPointerException.

代码 18 显示您的null对象作为参数传递给PrintStream.print()方法。查看此方法的源代码将告诉您为什么这样做notNPE 的结果:

public void print(Object obj) {
    write(String.valueOf(obj));
}

and String.valueOf()将执行此操作nulls:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

所以你可以看到那里有一个测试涉及null,并防止 NPE。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么空引用打印为“null” 的相关文章

随机推荐

  • Django Apache 错误:没有名为“encodings”的模块。 Windows Server 2008 R2 标准版

    我从 git 克隆 repo 我创建 venv python m venv myenv myenv scripts activate bat pip install r requirements txt pip install mod ws
  • 如何销毁在angular2中使用DynamicComponentLoader创建的所有组件?

    嗨 我发现了一篇关于使用动态组件加载器和处置方法添加和删除组件的帖子 我想一次性销毁所有创建的组件 我有笨蛋demo以及我找到演示的来源Angular 2 动态添加 删除组件 我知道我想存储所有componentref在一个数组中 然后迭代
  • 适用于 OpenGL 的 Android 传感器

    我想让 android 传感器与 opengl 一起工作 将 opengl 的相机旋转到手机指向的任何地方 详细说明一下 如果玩家正在看东方 我希望 opengl 的相机在游戏中也指向东方 如果玩家指向天空 我想将opengl的相机指向天空
  • 如何防止 CSS 关键帧动画在页面加载时运行?

    我有一个 div 其中的内容为动画 container position relative width 100px height 100px border style inset content visibility hidden webk
  • EF 针对 SQL 数据库项目反向 POCO?

    我可以直接针对 SQL 数据库项目使用 EF 反向 POCO 生成器吗 我将 SQL 数据库定义保存在 Visual Studio SQL 数据库项目 中 这为我提供了一些不错的版本控制功能 架构比较和一些漂亮的部署功能 有时我在开发过程中
  • 获取私人 gitlab 存储库

    尽管进行了所有尝试 我还是无法成功使用 go get 从 gitlab 获取私人仓库 我尝试过 netrc gitconfig 但它不起作用 我有一台带有 git 的私人机器 假设它是 mymachine prv git config gl
  • R:更改函数内的级别

    我有一个 data frame 我想更改因子变量的水平 所以我这样做 gt df1 lt data frame id 1 5 fact1 factor letters 1 5 gt head df1 id fact1 1 1 a 2 2 b
  • Windows Batch/解析html网页中的数据

    是否可以使用Windows批处理从Web html页面解析数据 假设我有一个网页 www domain com data page 1 页面源html div a href post view 664654 在这种情况下 我需要从网页获取
  • 如何使用 OpenCV 将偏导数高斯核应用于图像?

    我正在尝试重现一篇论文的结果 其中他们将图像与高斯核的水平偏导数进行卷积 我还没有找到任何方法可以用 OpenCV 来实现这一点 那可能吗 我是否必须获得高斯滤波器 然后手动计算偏导数 正如 akarsakov 所说 OpenCV 没有为此
  • 如何在 Visual Studio 2010 中调试从另一个进程启动的 C# .NET 应用程序

    我有一个用 C 编写的 NET GUI 应用程序和一个 PDF 打印机 PDF 打印机有一个字段 您可以在其中设置启动外部应用程序的命令 在这种情况下 我可以使用这台打印机打印文档 并且打印机启动我的 EXE 文件 并将生成的 PDF 文件
  • 播放直播时向每个 m3u8 和 ts 文件附加参数

    我在直播环境中使用 videojs 并使用 nginx 安全 URL 来保护流 详情请看这里 https www nginx com blog secure urls secure link module nginx plus 该算法运行良
  • 选择 Mat 的子集并复制它们以在 C++/Opencv 中创建新的 mat

    在 C opencv 中 如何选择大 Mat 的子集并复制它们以创建新 Mat 我知道如何使用 copyto colrange rowrange 等 但不知道如何将它们组合在一起来开发体面且高效的代码 谢谢 您可以使用copyTo 以此目的
  • OS X Lion 上的 68k 汇编器

    我需要为我的大学课程使用 68k 的汇编程序进行一些编程 我正在寻找一个程序来在 os x lion 上执行此操作 我发现 easy68k 正在 wine 中运行 但我感觉它运行不正常 有什么猜测吗 Vasm是一个可以针对 68k 构建并在
  • python pandas 动态读取csv文件

    我想在 for 循环中迭代地从一组 csv 文件中读取数据 csv 文件命名为 1 csv 2 csv等等 读取数据的正常方法是 data pd read csv 1 csv 请有人建议如何更换1 by i当使用一个for loop I t
  • 用于确定操作系统类型的环境变量(Windows XP、Windows 7)

    我想在 XML 文件中区分 Windows XP 和 Windows 7 我想我会在 XML 中使用环境变量 但是我找不到 Windows 中定义的任何提供此信息的系统环境变量 我看到 OSTYPE 变量 但它仅在 Windows 7 中可
  • 使用 Ajax 调用的结果更新 div

    我想显示下面的 ajax 函数对 dom 中的 div 的响应 更新 div 在不使用重型插件的情况下如何做到这一点 url http dowmian com xs1 getcam php type GET data id success
  • 如何控制IE中onbeforeunload的动作?

    我有一个问题onbeforeunload最近 当用户尝试关闭 IE 浏览器时 我需要弹出一个投票页面 我通过使用以下方法做到了 以及主要结构makevote 在javascript中如下 function makevote comet di
  • 包含点 (0,0) 的三角形数量

    首先 归功于 Topcoder 因为这个问题被用在他们的一个 SRM 中 但他们没有对此进行编辑 在这个问题中 我得到了 n 个点 其中 n 介于 1 到 1000 之间 对于每三个点 显然有一个三角形将它们连接起来 问题是 这些三角形中有
  • 当用户在 Excel 中向右滚动时移动形状(VBA)

    I have an excel workbook with two shapes on Sheet1 like below 我的要求是当用户向工作表右侧导航时 即向 headers24 header25 等导航时 我希望工作表上的两个形状随
  • 为什么空引用打印为“null”

    在 println 中 这里 o toString 抛出 NPE 但 o1 不会 为什么 public class RefTest public static void main String args Object o null Obje