首页
学习
活动
专区
圈层
工具
发布

从一个 NullPointerException 探究 Java 的自动装箱拆箱机制

test(value); } } main 方法里的代码实际上相当于调用 test(null);,为什么不直接这样写呢?...抛出问题 运行时提示 test(value); 这一行抛出 NullPointerException,但是看着以上代码会有些许困惑:以上代码里一个对象方法都没有调用啊,NullPointerException...,包装类对象与包装类对象之间的比较,都是自动拆箱后对基本数据类型值进行比较,所以,要注意这些类型间进行比较时自动拆箱可能引发的 NullPointerException。...2.java.lang.NullPointerException 尝试对一个值为 null 的包装类对象进行自动拆箱,就有可能造成 NullPointerException。...null : 1; // NullPointerException } } 这实际上还是对一个值为 null 的 Long 类型进行自动拆箱,反汇编代码: Compiled from "Test.java

67120

告别NPE噩梦:彻底解决Java NullPointerException的根源与实践(附代码)

它不是一个编译错误,而是在程序运行时,当某个对象引用为 null,你却尝试调用它的方法或者访问它的字段时,JVM(Java虚拟机)就会无情地抛出这个异常。...简单来说,NullPointerException 是当一个对象引用被赋值为 null(意味着它不指向内存中的任何实际对象),然后你试图通过这个 null 引用去调用方法或访问成员变量时,Java运行时系统就会抛出的一个异常...; // myString 引用现在是null System.out.println(myString.length()); // 尝试调用null对象的length()方法,NPE发生...对象引用为null,却尝试调用其方法或访问其字段 这是最直接、最常见的NPE原因。你声明了一个引用变量,但没有给它赋一个实际的对象实例,或者它的值被显式地设为了null。...集合对象为null,却尝试对其进行操作 这与第一个场景类似,但更具体针对集合类(如List, Set, Map)。如果一个集合引用是null,你却尝试添加元素、遍历或检查其大小,就会抛出NPE。

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    详解 Java 中的四种引用

    也不能通过虚引用来得到其指向的对象(其 get 方法直接返回 null)。那么虚引用有什么作用呢?虚引用一般会配合 引用队列(ReferenceQueue)来使用。...,既然其不会影响对象的生命周期,那么使用和不使用虚引用指向对象对这个对象是否被 JVM 回收是没有任何区别的,那么我们就可以将其看做没有使用虚引用时的代码,此时效果自然和直接使用强引用一样。...引用队列 在上节的代码中,我们新建了一个引用队列(ReferenceQueue)对象,并且在创建软引用、弱引用和虚引用对象时将其作为参数传入对应引用的构造方法中。...GC 调用, * 之后,通过该引用对象的 get 方法得到的返回值为 null, 该方法不应该被程序员主动调用 */ public void clear() {...ReferenceQueue.NULL : queue; } } 我们在 Reference 类中的 enqueue 方法(这个方法本身会被 GC 线程调用)中发现其直接调用了对应引用队列(ReferenceQueue

    62730

    NullPointerException : Attempt to invoke a method on a null object reference 完美解决方法

    今天的主题是大家在Java开发中经常遇到的经典错误:NullPointerException(简称NPE)。这个错误通常发生在尝试对null对象调用方法时,它不仅困扰新手,也会让经验丰富的开发者头疼。...关键词:NullPointerException、Java错误、null对象引用问题修复。...{ // 类定义 } 当你尝试在null对象上调用方法或访问其字段时,Java虚拟机(JVM)将会抛出这个异常。...导致NullPointerException的常见原因 2.1 对未初始化的对象调用方法 在对象尚未被初始化或赋值之前,试图调用其方法是导致NPE的最常见原因。...表格总结 错误原因 解决方案 调用未初始化的对象方法 在调用前检查是否为null 遍历空数组或集合 在循环前确认集合不为空 操作返回null的函数结果 使用Optional类包装可能为null的返回值

    1.3K10

    从一个 NullPointerException 探究 Java 的自动装箱拆箱机制

    test(value); } } main 方法里的代码实际上相当于调用 test(null);,为什么不直接这样写呢?...抛出问题 运行时提示 test(value); 这一行抛出 NullPointerException,但是看着以上代码会有些许困惑:以上代码里一个对象方法都没有调用啊,NullPointerException...,包装类对象与包装类对象之间的比较,都是自动拆箱后对基本数据类型值进行比较,所以,要注意这些类型间进行比较时自动拆箱可能引发的 NullPointerException。...== 比较特殊,因为可以用于判断左右是否为同一对象,所以两个包装类对象之间 ==,会用于判断是否为同一对象,而不会进行自动拆箱操作;包装类对象与基本数据类型值之间 ==,会自动拆箱。...null : 1; // NullPointerException } } 这实际上还是对一个值为 null 的 Long 类型进行自动拆箱,反汇编代码: Compiled from "Test.java

    67110

    Flink原理 | Flink中的数据抽象及数据交换过程

    但是在JVM的世界中,如果一个方法是一个虚方法,那么每次调用时,JVM都要花时间去确定调用的到底是哪个子类实现的该虚方法(方法重写机制,不明白的去看JVM的invokeVirtual指令),也就意味着每次都要去翻方法表...;而如果该方法虽然是个虚方法,但实际上整个JVM里只有一个实现(就是说只加载了一个子类进来),那么JVM会很聪明的把它去虚化处理,这样就不用每次调用方法时去找方法表了,能够大大提升性能。...这个主要是当数据从jvm里的一个对象被序列化成字节数组时用的; Flink的这个Buffer接口主要是一种flink层面用于传输数据和事件的统一抽象,其实现类是NetworkBuffer,是对MemorySegment...其实例化时就会尝试获取所有可由它管理的内存(对于堆内存来说,直接获取所有内存并放入老年代,并令用户对象只在新生代存活,可以极大程度的减少Full GC),我们看看其构造方法: public NetworkBufferPool...在这行代码中,Flink把对象调用该对象所属的序列化器序列化为字节数组。 数据流转过程 上一节讲了各层数据的抽象,这一节讲讲数据在各个task之间exchange的过程。 整体过程 看这张图: ?

    2.3K10

    Java并发-ThreadLocal

    () { // 初始化null值 return null; } 调用ThreadLocalMap.get方法,获取当前值。...1.2.4 虚引用(PhantomReference) 无法通过虚引用来访问对象的任何属性或函数。虚引用仅仅提供了一直确保对象被finalize后,做某些事情的机制。...虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾收集器准备回收某个对象时,若发现它还有虚引用,则会在回收对象的内存之前,将这个虚引用加入到与之关联的引用队列中。...1.2.5 引用队列(ReferenceQueue) 引用队列可以和软引用、弱引用、虚引用一起配合使用,当垃圾回收器回收一个对象时,若发现它还有引用,就会在回收对象之前将这个引用加入到与之关联的引用队列中去...); // ... } 父线程在调用Thread构造方法生成一个子线程时,构造方法最终会调用Thread#init方法。

    60610

    Java 中的 null 到底是什么?

    这意味着该变量没有指向任何有效的内存地址,因此它不指向任何对象。如果尝试在 null 引用上调用任何方法或字段,则会引发 NullPointerException 异常。...当试图调用 str.length() 时,将抛出 NullPointerException 异常。null 的用途在 Java 中,null 有许多用途。以下是一些常见的用途:1....初始化对象引用在 Java 中,声明一个对象变量时,它的默认值是 null。这意味着在声明变量后,它不会引用任何对象。...clearObjects() 方法将该数组中的所有对象引用设置为 null,释放对这些对象的引用,并使它们成为可回收的对象。null 的问题虽然 null 在 Java 中非常常见,但它也有一些问题。...可能引发 NullPointerException如果尝试在 null 引用上调用任何方法或字段,则会引发 NullPointerException 异常。

    1.7K00

    java中的reference(二): jdk1.8中Reference的源码阅读

    虚引用 对引用无影响,只用于获取对象被回收的通知 FinalReference - Java用于实现finalization的一个内部类 2....虚可达(Phantom Reachable) 虚引用(Phantom Reference) 如果一个对象不是强可达,软可达或者弱可达,并且这个对象已经finalize过了,并且有虚引用指向该对象,那么这个对象就是虚可达的...不可达(Unreachable) - 如果一个对象不是强可达,软可达或者弱可达,并且这个对象已经finalize过了,并且有虚引用指向该对象,那么这个对象就是虚可达的。...需要注意的是,为了不与GC冲突,ReferenceHandler不生成新的对象,也不调用用户代码。避免对GC过程造成影响。 4....reallypoll方法: // 引用队列的poll操作,此方法必须在加锁情况下调用 private Reference<?

    85330

    【JVM从小白学成大佬】3.深入解析强引用、软引用、弱引用、幻象引用

    null sf.get();  通过上面的代码可以看出sf是对obj的一个软引用,当sf对象还没有被销毁前,sf.get()可以获取到这个对象,如果已被销毁,则返回null。...因为垃圾收集器可能在任意时刻回收软引用,如果不做是否null的判断,可能会出现NullPointerException的异常。 总的来说,软引用是用来描述一些还有用但并非必需的对象。...幻象引用并不会决定对象的生命周期。即如果一个对象仅持有虚引用,就相当于没有任何引用一样,在任何时候都可能被垃圾回收器回收。...当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。...任何一个对象的finalize()方法都只会被系统自动调用一次,如果对象面临下一次回收,它的finalize()方法不会被再次执行。

    68310

    【必知必会】深入解析强引用、软引用、弱引用、幻象引用

    null sf.get();   通过上面的代码可以看出sf是对obj的一个软引用,当sf对象还没有被销毁前,sf.get()可以获取到这个对象,如果已被销毁,则返回null。...因为垃圾收集器可能在任意时刻回收软引用,如果不做是否null的判断,可能会出现NullPointerException的异常。...幻象引用并不会决定对象的生命周期。即如果一个对象仅持有虚引用,就相当于没有任何引用一样,在任何时候都可能被垃圾回收器回收。...//永远返回null pf.get(); //返回是否从内存中已经删除 pf.isEnQueued();   幻象引用的get方法永远返回null,主要用于检查对象是否已经从内测中删除。...通过上面的分析中可以得知,除了幻象引用(因为get永远返回null),如果对象还没有被销毁,都可以通过get方法获取原有对象。

    75720

    Java魔法堂:四种引用类型、ReferenceQueue和WeakHashMap

    虚引用(Phantom Reference)       又称为幽灵引用或幻影引用,,虚引用既不会影响对象的生命周期,也无法通过虚引用来获取对象实例,仅用于在发生GC时接收一个系统通知。  ...引用队列有如下实例方法: Reference ReferenceQueue#poll() ,从队列中出队一个元素,若队列为空则返回null。 Reference queue 字段存放引用对象对应的引用队列,若Reference子类构造函数中没有指定则使用ReferenceQueue.NULL,也就是说每个软、弱、虚引用对象必定与一个引用队列关联...Reference通过静态代码块启动一个优先级最高的守护线程检查pending字段为null,若不为null则沿着单向链表将引用对象追加到该引用对象关联的引用队列当中(除非引用队列为ReferenceQueue.NULL...clear或put等直接或间接调用私有expungeStaleEntries方法的实例方法时,则这些键对象已被回收的项目(Entry)将被移除出键值对集合中。

    81670

    【面试虐菜】—— JAVA面试题(2)

    然后,这个过程实际上是这样的:首先创建一个StringBuffer对象,然后用StringBuffer类的append方法追加字符串,最后对StringBuffer对象调用toString方法合成字符串返回...包装类器包括Byte、Short、Integer、Long、Float、Double、Character、Boolean等类,主要用来对byte、short、integer、long、float、double...而引用类的传递时引用,即虚地址,例如g(new Employee())是把实际参数的虚地址传递给形式参数e,也就是说实际参数和形式参数的虚地址相同,物理上是同一个对象。...是==在比较引用类型时,比较的是两个对象的虚地址,而不是内容。要比较两个对象的内容是否相同,往往需要使用equal方法,例如if(s.equals(“save”)){}。...常用方法:toString()  equals finalize() 14 Object类的equals与hashcode方法 解析:在Object类中,equals方法比较对象的引用值,也就是只有物理上是同一对象的两个引用

    90250

    【Java】已解决java.lang.NullPointerException异常

    这种问题通常发生在访问或修改一个尚未被实例化(即分配内存)的对象的成员时。 二、可能出错的原因 对象未初始化:在引用对象之前,没有为其分配内存。...对象被设置为null:在程序的某个地方,对象被显式地设置为null,随后又被使用。 方法返回null:一个方法被期望返回一个对象,但实际上返回了null,而调用者没有检查这一点。...} } 在这个例子中,message字段在printMessage方法被调用前没有被初始化,因此尝试调用toUpperCase()方法时会抛出NullPointerException。...检查返回值:如果方法可能返回null,在调用该方法后检查返回值是否为null。...避免链式调用:当对象可能为null时,避免进行链式调用,因为这可能会导致在调用链中较早的位置抛出NullPointerException。

    2.7K10

    谈谈JDK堆外内存的创建和回收

    ; } 首先调用父类的构造方法初始化ByteBuffer的四个基本属性,接下来reserveMemory方法是判断堆外剩余内存是否满足。...) 虚引用,正如其名,对一个对象而言,这个引用形同虚设,有和没有一样。...如果一个对象与GC Roots之间仅存在虚引用,则称这个对象为虚可达(phantom reachable)对象。...当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在垃圾回收后,将这个虚引用加入引用队列,可以通过检查引用队列中是否有相应的虚引用来判断对象是否已经被回收了。...占用的空间相比堆外内存只是冰山一角,当DirectByteBuffer对象被回收,Cleaner对象也就是虚引用被加入到Pending list,PendingHandlerThread线程执行Cleaner

    85210
    领券