在java中对null的理解

转载:https://www.cnblogs.com/X-World/p/5686122.html

Java中的Null是什么?

1)首先,null是关键字,像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错。

2)就像每种基本类型都有默认值一样,如int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。就像你创建了一个布尔类型的变量,它将false作为自己的默认值,Java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你)。为了证明这个事实,你可以通过创建一个变量然后打印它的值来观察这个引用变量。

3)我们要澄清一些误解,null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型,来看下面的代码:

String str = null;
Integer i = null;
Double d = null;

String myStr = (String) null;
Integer myI = (Integer) null;
Double myD = (Double) null;
你可以看到在编译和运行时期,将null强制转换成任何引用类型都是可行的,在运行时期都不会抛出空指针异常。
4)null可以赋值给引用变量,你不能将null赋给基本类型变量,例如int、double、float、boolean。编译器将会报错。

正如你看到的那样,当你直接将null赋值给基本类型,会出现编译错误。但是如果将null赋值给包装类object,然后将object赋给各自的基本类型,编译器不会报,但是你将会在运行时期遇到空指针异常。这是Java中的自动拆箱导致的。
5) 任何含有null值的包装类在Java拆箱生成基本数据类型时候都会抛出一个空指针异常。一些程序员犯这样的错误,他们认为自动装箱会将null转换成各自基本类型的默认值,例如对于int转换成0,布尔类型转换成false,但是那是不正确的,如下面所示:

Integer iAmNull = null;
int i = iAmNull; // Remember - No Compilation Error

但是当你运行上面的代码片段的时候,你会在控制台上看到主线程抛出空指针异常。在使用HashMap和Integer键值的时候会发生很多这样的错误。当你运行下面代码的时候就会出现错误。
public class Test3 {
  public static void main(String args[]) throws InterruptedException {
    Map numberAndCount = new HashMap<>();
    int[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};
    for(int i : numbers){
      int count = (int) numberAndCount.get(i);//NullPointerException
      numberAndCount.put(i, count++);
    }
  }
}
package test;
import java.util.HashMap;
import java.util.Map;

public class Test3 {
  public static void main(String args[]) throws InterruptedException {
    Map numberAndCount = new HashMap<>();
    Integer[] numbers = {3, 5, 7,9, 11, 13, 17, 19, 2, 3, 5, 33, 12, 5};

    for(Integer i : numbers){
      Integer count = (Integer) numberAndCount.get(i);
      numberAndCount.put(i, count++); // NullPointerException
    }  
  }
}

这段代码看起来非常简单并且没有错误。你所做的一切是找到一个数字在数组中出现了多少次,这是Java数组中典型的寻找重复的技术。开发者首先得到以前的数值,然后再加一,最后把值放回Map里。程序员可能会以为,调用put方法时,第一种方式是转换int报空指针,验证之前说的。第二种方式,自动装箱会自己处理好拆装箱问题,但是忘记了当一个数字没有计数值的时候,get方法返回null,而不是0,因为Integer的默认值是null而不是0。当把null值传递给一个int型变量的时候自动装箱将会返回空指针异常。

6)如果使用了带有null值的引用类型变量,instanceof操作将会返回false

1
2
3
4
5
6
Integer iAmNull = null;
if(iAmNull instanceof Integer){
System.out.println(“iAmNull is instance of Integer”);
}else{
System.out.println(“iAmNull is NOT an instance of Integer”);
}
  这是instanceof操作一个很重要的特性,使得对类型强制转换检查很有用

7)你可能知道不能调用非静态方法来使用一个值为null的引用类型变量。它将会抛出空指针异常,但是你可能不知道,你可以使用静态方法来使用一个值为null的引用类型变量。因为静态方法使用静态绑定,不会抛出空指针异常。下面是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Testing {
public static void main(String args[]){
Testing myObject = null;
myObject.iAmStaticMethod();
myObject.iAmNonStaticMethod();
}

private static void iAmStaticMethod(){
System.out.println(“I am static method, can be called by null reference”);
}

private void iAmNonStaticMethod(){
System.out.println(“I am NON static method, don’t date to call me by null”);
}
8)你可以将null传递给方法使用,这时方法可以接收任何引用类型,例如public void print(Object obj)可以这样调用print(null)。从编译角度来看这是可以的,但结果完全取决于方法。Null安全的方法,如在这个例子中的print方法,不会抛出空指针异常,只是优雅的退出。如果业务逻辑允许的话,推荐使用null安全的方法。

9)你可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。在Java中null==null将返回true。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

obs video-io.c

video_frame_init 讲解 /* messy code alarm video_frame_init 函数用于初始化视频帧。它接受一个指向 struct video_frame 结构体的指针 frame&#xff0c; 视频格式 format&#xff0c;以及宽度 width 和高度 height。该函数根据视频格式的不同&#xff0c;计算出每个视频帧…

如何解决SVN 清理失败

解决方法&#xff1a; 下载 sqlite3.exe 在你的清理失败的路径下查看.svn目录下是否存在一个wc.db文件&#xff0c;把解压好的sqlite3.exe 放在wc.db文件的同一路径下 注意&#xff1a;主要是用sqlite3.exe清理掉wc.db中的相关信息。 通过cmd命令行进入你清理失败的路径&am…

10-Linux与windows文件互传-pscp坑---- 'pscp' 不是内部或外部命令,也不是可运行的程序或批处理文件...

1.下载pscp工具http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html2.拷贝到C:\Windows\System32 如果考到其他文件夹&#xff0c;运行提示 pscp 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。 那么考到这个文件下吧&#xff01;&#xff0…

MongoDB最简单的入门教程之三 使用Java代码往MongoDB里插入数据

前两篇教程我们介绍了如何搭建MongoDB的本地环境&#xff1a; MongoDB最简单的入门教程之一 环境搭建 以及如何用nodejs读取MongoDB里的记录&#xff1a; MongoDB最简单的入门教程之二 使用nodejs访问MongoDB 这篇教程我们会介绍如何使用Java代码来连接MongoDB。 如果您是基于M…

oracle创建用户及授权等相关操作

1、创建用户 create user test identified by test; 这样就创建了一个用户名密码都为test的用户 但这个时候test还是不能登陆成功的&#xff0c;我们需要赋予相应的权限 2、赋予create session 的权限 grant create session to test; 这样test用户就能成功登录进去赋予用户创…

Warning: Received `false` for a non-boolean attribute `xxx`.

React对boolean类型的attribute的识别方式问题&#xff0c;可以采用以下方法解决&#xff1a; xxx{value ? 1 : 0} 改成数字的写法&#xff0c;不用布尔值。 具体可以参考&#xff1a;https://github.com/styled-components/styled-components/issues/1198 转载于:https://www…

row_number() over(partition by order by )使用说明书

作用&#xff1a;数据库去除重复记录&#xff0c;进行排序。 语法&#xff1a;ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) 功能&#xff1a;表示根据COL1分组&#xff0c;在分组内部根据 COL2排序&#xff0c;而这个值就表示每组内部排序后的顺序编号&#xff08;组…

C点滴成海------Dev C++怎么修改成简体中文

第一步&#xff1a;选择菜单中的Tools 第二步&#xff1a;选择Tools中的“Envirnoment Options”&#xff0c;即第二个选项 第三步&#xff1a;选择中文并保存 将"1"的语言改成中文就行了 转载于:https://www.cnblogs.com/hahayixiao/p/9824080.html

PLSQL快捷键使用,让你高速开发

不需要选中整行&#xff0c;执行光标所在行&#xff0c;按F8就可直接执行&#xff1b; 工具—>首选项—>SQL窗口—>自动选择&#xff0c;勾选自动选择即可。 这样光标放在此行&#xff0c;按F8就可以执行&#xff0c;需要注意的是sql语句必须以分号结束。下期更新

eclipse的优化操作

取消“updating maven dependencies” 如果没有用到maven&#xff0c;可以取消这个操作。eclipse下可以选上这个选项 Window -> Preferences -> Maven -> enable Offline option MyEclipse的话&#xff0c;取消了Maven4MyEclipse的话&#xff0c;update maven index…

case when then else end

sql case when then else end 查询生成统计列表 case具有两种格式。简单case函数和case搜索函数。 –简单case函数 case sexwhen 1 then 男when 2 then 女else 其他 end--case搜索函数case when sex 1 then 男when sex 2 then 女else 其他 end这两种方式&#xff0c;可以实…

XML报错,是启动不了服务的。

XML报错&#xff0c;是启动不了服务的。

sql优化——模糊查询

like 和 instr的查询效率 select name from user where instr(id, 99)> 0; 等价于select name from user where id like %99%; LIKE查询一次&#xff0c;就走一次全表扫描&#xff0c;效率非常慢 同样的效果&#xff0c;现在来换做INSTR函数来执行&#xff0c;时间上…

Oracle创建序列,删除序列

1、创建 -- Create sequence create sequence SEQ_USERID minvalue 1 maxvalue 999999999999 start with 1 increment by 1 nocache cycle; 2、查询 select SEQ_USERID.nextval from dual; 3、删除 drop sequence SEQ_USERID&#xff1b;

Oracle创建、删除、备份表

1、创建 create table USER (ID NUMBER(20) not null,constraint PK_USER primary key (ID) //主键 );//添加注释 comment on table USER is 人员信息表; comment on column USER.ID is 人员ID; 2、备份表 create table USER_temp as select * from USER; --只取表结构…

MacOS下安装BeautifulSoup库及使用

BeautifulSoup简介 BeautifulSoup库是一个强大的python第三方库&#xff0c;它可以解析html进行解析&#xff0c;并提取信息。 安装BeautifulSoup 打开终端&#xff0c;输入命令&#xff1a;pip3 install beautifulsoup4 BeautifulSoup库小测 小测用到的html页面地址&#xff1…

Java中当前的时间的各种写法

1、系统时间&#xff08;电脑上显示的时间&#xff09; //导入的包&#xff1a; import java.text.SimpleDateFormat; import java.util.Date;SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 String dqsj df.format(new Date()…

第十章 深入理解Session与Cookie

理解Cookie 理解Session Cookie安全问题 分布式Session框架 Cookie压缩 表单重复提交问题 多终端Session统一转载于:https://www.cnblogs.com/hzzjj/p/9825639.html

sql 修改字段 删除字段操作

1、修改字段 --修改字段名 alter table [表名] rename column oldCname to newCName; --修改数据类型 alter table [表名] modify (columnName 数据类型); 2、删除字段 alter table [表名] drop column [字段名]

oracle创建、删除索引等操作

1、创建索引 create index 索引名 on 表名(列名); 2、删除索引 drop index 索引名; 3、创建组合索引 create index 索引名 on 表名(列名1,,列名2); 4、查询索引 --根据索引名&#xff0c;查询表索引字段 select * from user_ind_columns where index_name索引名; --根据…