为何将未被初始化的Integer变量赋值给int变量时会抛出空指针异常?

摘要:
因为Java编译器将为类中未初始化的原始数据类型的实例变量分配默认值,但不会为引用数据类型分配默认值。int类型的赋值为0。将0赋值给整型变量i是合法的,因此可以成功执行。

Integer的NullPointerException

学习包装类的时候看到这样一个问题:

public class TestBox {

    Integer i;
    int j;

    public void go(){
        j = i;//第七行
        System.out.println(j);
        System.out.println(i);
    }
    
    public static void main(String[] args) {
        TestBox t = new TestBox();
        t.go();
    }
    
}

为何将未被初始化的Integer变量赋值给int变量时会抛出空指针异常?第1张

百度后,才知道将未初始化的Integer变量(即i)赋给int型变量j,由于未初始化的i的值为null,就会报错。
下图是输出未被初始化的i的截图:
为何将未被初始化的Integer变量赋值给int变量时会抛出空指针异常?第2张

将第七行的j = i;改为i=j;再运行,是成功的。

为何将未被初始化的Integer变量赋值给int变量时会抛出空指针异常?第3张

为什么呢?因为java编译器会给类中未被初始化的原始数据类型的实例变量赋一个默认值,但不会给引用数据类型赋默认值。
int类型的赋值为0,将0赋给一个Integer类型的变量i是合法的,所以能够执行成功。

免责声明:文章转载自《为何将未被初始化的Integer变量赋值给int变量时会抛出空指针异常?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇cursor url 自定义鼠标样式一句SQL实现获取自增列操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

IOS基础之 (十) 内存管理

一 基本原理 1.什么是内存管理 移动设备的内存有限,每个app所能占用的内存是有限制的。 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间。比如回收一些不需要使用的对象,变量。 管理范围:任何继承了NSObject,对其他基本数据类型(int, char, float, double,struct,enum等)无效。...

【javascript】浅析js中的堆和栈

这里先说两个概念:1、堆(heap)2、栈(stack)堆 是堆内存的简称。栈 是栈内存的简称。说到堆栈,我们讲的就是内存的使用和分配了,没有寄存器的事,也没有硬盘的事。各种语言在处理堆栈的原理上都大同小异。堆是动态分配内存,内存大小不一,也不会自动释放。栈是自动分配相对固定大小的内存空间,并由系统自动释放。 javascript的基本类型就5种:Unde...

关于c语言内存分配,malloc,free,和段错误,内存泄露

1.   C语言的函数malloc和free  (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数        void * malloc(size_t size) 动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL。        void  free(void *ptr) 释放动态申请...

单片机的内存分配(变量的存储位置)详解

原文链接:https://blog.csdn.net/as480133937/article/details/87608816 单片机的内存分配(变量的存储位置)详解 对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年 都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM(flash)、RAM(sram)启动,首先 需要对 链接...

怎样编写NES模拟器

怎样写模拟器作者: Nikolas GavalasEmail: thundermahoney@hotmail.com 怎样写模拟器简介阶段读入运行获得 ROM 的操作码执行操作码执行中断读写内存做循环任务视频模拟声音模拟优化课程收获我的模拟器参考文献 +------+| 简介 |+------+ 模拟你喜欢的系统来玩游戏比你想象的要简单 (简单程度依赖于你...

Rust中的变量的声明和定义

变量的声明和定义 Rust中合法的标识符(包括变量名、函数名、triat名等)必须由数字、字母、下划线组成,而且不能以数字开头。这个和很多语言都是一样的。Rust将来也会允许其他Unicode字符作为标识符,还有raw identifier功能,这样可以使关键字作为标识符,比如r#self,这个用途在FFI中最多。 变量的声明: let variable...