Java中关于 null 的几种处理方式详解

对于 Java 程序员来说,空指针⼀直是恼⼈的问题,我们在开发中经常会受到 NullPointerException 的异常。Java 的发明者也承认这是⼀个巨⼤的设计错误。那么关于 null ,你应该知道下⾯这⼏件事情来有效的了解 null ,从⽽避免很多由 null 引起的错误。

⼤⼩写敏感

⾸先,null 是 Java 中的 关键字 ,像是 public、static、final。它是⼤⼩写敏感的,你不能将 null 写 成 Null 或 NULL,编辑器将不能识别它们然后报错。

这个问题已经⼏乎不会出现,因为 eclipse 和 Idea 编译器已经给出了编译器提示,所以你不⽤考虑这
个问题。

null 是任何引⽤类型的初始值

null 是所有引⽤类型的默认值,Java 中的任何引⽤变量都将null作为默认值,也就是说所有 Object 类下的引⽤类型默认值都是 null。这对所有的引⽤变量都适⽤。就像是基本类型的默认值⼀样,例如 int的默认值是 0,boolean 的默认值是 false。
下⾯是基本数据类型的初始值

类型 初始值
booleab false
char /u0000
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d

null 只是⼀种特殊的值

null 既不是对象也不是⼀种类型,它仅是⼀种特殊的值,你可以将它赋予任何类型,你可以将 null 转换为任何类型

public static void main(String[] args) {
 String str = null;
 Integer itr = null;
 Double dou = null;
 Integer integer = (Integer) null;
 String string = (String)null;
 System.out.println("integer = " + integer);
 System.out.println("string = " + string);
}

你可以看到在编译期和运⾏期内,将 null 转换成任何的引⽤类型都是可⾏的,并且不会抛出空指针异常。

null 只能赋值给引⽤变量,不能赋值给基本类型变量。

持有 null 的包装类在进⾏⾃动拆箱的时候,不能完成转换,会抛出空指针异常,并且 null 也不能和基本数据类型进⾏对⽐

public static void main(String[] args) {
 int i = 0;
 Integer itr = null;
 System.out.println(itr == i);
}

使⽤了带有 null 值的引⽤类型变量, instanceof instanceof 操作会返回

public static void main(String[] args) {
 Integer isNull = null;
 // instanceof = isInstance ⽅法
 if(isNull instanceof Integer){
 System.out.println("isNull is instanceof Integer");
 }else{
 System.out.println("isNull is not instanceof Integer");
 }
}

这是 instanceof 操作符⼀个很重要的特性,使得对类型强制转换检查很有⽤静态变量为 null 调⽤静态⽅法不会抛出 NullPointerException。因为静态⽅法使⽤了静态绑定。

使⽤ Null-Safe ⽅法

你应该使⽤ null-safe 安全的⽅法,java 类库中有很多⼯具类都提供了静态⽅法,例如基本数据类型的包装类,Integer , Double 等。例如

public class NullSafeMethod {
 private static String number;
 public static void main(String[] args) {
 String s = String.valueOf(number);
 String string = number.toString();
 System.out.println("s = " + s);
 System.out.println("string = " + string);
 }
}

number 没有赋值,所以默认为null,使⽤ String.valueOf(number) 静态⽅法没有抛出空指针异常,但是使⽤ toString() 却抛出了空指针异常。所以尽量使⽤对象的静态⽅法。

null 判断

你可以使⽤ == 或者 != 操作来⽐较 null 值,但是不能使⽤其他算法或者逻辑操作,例如⼩于或者⼤于。跟SQL不⼀样,在Java中 null == null 将返回 true,如下所示:

public class CompareNull {
 private static String str1;
 private static String str2;
 public static void main(String[] args) {
 System.out.println("str1 == str2 ? " + str1 == str2);
 System.out.println(null == null);
 }
}

到此这篇关于Java中关于 null 的⼏种处理⽅式的文章就介绍到这了,更多相关Java null处理⽅式内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • java静态工具类注入service出现NullPointerException异常处理

    目录 一般我们在controller层调用service时,只需要使用@Autowired注解即可,例如如下代码我们经常看到: @RestController @RequestMapping("business") public class BizResourceController { @Autowired private BusinessService businessService; @RequestMapping(path = "/queryYearList"

  • java.lang.NullPointerException 如何处理空指针异常的实现

    当应用程序试图null在需要对象的情况下使用时抛出.这些包括: 调用null对象的实例方法. 访问或修改null对象的字段. 把长度null当作一个数组. 像访问或修改null阵列一样访问或修改插槽. 投掷null就好像它是一个Throwable 价值. 应用程序应该抛出此类的实例来指示null对象的其他非法使用. NullPointerException对象可以由虚拟机构造,就像抑制被禁用和/或堆栈跟踪不可写一样. 为什么我们需要空值? 如前所述,nullJava是一种特殊的值. 它在编码某些

  • Java中关于 null 的几种处理方式详解

    对于 Java 程序员来说,空指针⼀直是恼⼈的问题,我们在开发中经常会受到 NullPointerException 的异常.Java 的发明者也承认这是⼀个巨⼤的设计错误.那么关于 null ,你应该知道下⾯这⼏件事情来有效的了解 null ,从⽽避免很多由 null 引起的错误. ⼤⼩写敏感 ⾸先,null 是 Java 中的 关键字 ,像是 public.static.final.它是⼤⼩写敏感的,你不能将 null 写 成 Null 或 NULL,编辑器将不能识别它们然后报错. 这个问题

  • oracle中if/else的三种实现方式详解

    1.标准sql规范 1.单个IF IF v=... THEN END IF; 2.IF ... ELSE IF v=... THEN ELSE t....; END IF; 3.多个IF IF v=... THEN ELSIF v=... THEN t...; END IFL 注意: 多个IF的是'ELSIF' 不是 ' ELSE IF' 2.decode函数 DECODE(VALUE,IF1,THEN1,IF2,THEN2,IF2,THEN2,..,ELSE) 表示如果value等于if1时,

  • java固定大小队列的几种实现方式详解

    目录 前言 基于Hutool中的FixedLinkedHashMap 基于Guava的EvictingQueue 基于Redis的list操作 总结 前言 最近团队有同学在开发中,遇到一个需求,统计最近10次的异常次数,咨询有没有类似的list.针对这个问题,记录一下几种处理方式. 基于Hutool中的FixedLinkedHashMap 引入maven依赖 <dependency> <groupId>cn.hutool</groupId> <artifactId

  • Java中分割字符串的两种方法实例详解

    前言 相信大家应该都知道在java编程中,有时候我们需要把一个字符串按照某个特定字符.字母等作为截点分割这个字符串,这样我们就可以使用这个字符串的一部分或者把所有截取的内容保存到数组里等操作.下面这篇文章就给大家分享了两种分割的方法,下面来一起看看吧. 一.java.lang.String 的 split() 方法, JDK 1.4 or later public String[] split(String regex,int limit) 示例代码 public class StringSpl

  • java中关于Map的三种遍历方法详解

    map的三种遍历方法!集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方法各有优缺点~~ 复制代码 代码如下: /* * To change this template, choose Tools | Templates * and open the template in the editor. */package cn.tsp2c.liubao;import java.util.Collection;import java.util.HashMap;import java.util

  • java中实现分页的几种常见方式总结

    目录 1. 前言 2. 先说结论 3. 例子 1. 数据库SQL的限制条件(limit.fetch) 2. 使用List集合的截取功能实现 3. 插件PageHelper 总结 1. 前言 无论是自我学习中,还是在工作中,固然会遇到与前端搭配实现分页的功能,发现有几种方式,特此记录一下. 2. 先说结论 分页功能直接交给前端实现(根据业务场景且仅仅只能用于数据量少的情况).即后端不做任何数据的限制,直接把全部数据返回给前端,前端通过组件实现分页,筛选等功能.请不要轻视该方式,好处即只需要前后端交

  • Java中枚举类型的一种使用方式

    今天改同事的代码发现同事的代码中有大量的if else语句.很不美观而且可读性太差. 因为需要给前端一个key,value的列表.这个列表写死.然而同事的代码. 放几张图,大家自己感受.我都不知道以后这个api咋维护,新增一个工站,减少一个工站. 果然新的任务新增4个工站,好吧,开始给代码装扮一下. 首先,写一个枚举类. package com.smartflow.common.enumpackage; /** * @author :tao * @date :Created in 2020/8/

  • Java中的引用和动态代理的实现详解

    我们知道,动态代理(这里指JDK的动态代理)与静态代理的区别在于,其真实的代理类是动态生成的.但具体是怎么生成,生成的代理类包含了哪些内容,以什么形式存在,它为什么一定要以接口为基础? 如果去看动态代理的源代码(java.lang.reflect.Proxy),会发现其原理很简单(真正二进制类文件的生成是在本地方法中完成,源代码中没有),但其中用到了一个缓冲类java.lang.reflect.WeakCache<ClassLoader,Class<?>[],Class<?>

  • 基于Java中最常用的集合类框架之HashMap(详解)

    一.HashMap的概述 HashMap可以说是Java中最常用的集合类框架之一,是Java语言中非常典型的数据结构. HashMap是基于哈希表的Map接口实现的,此实现提供所有可选的映射操作.存储的是对的映射,允许多个null值和一个null键.但此类不保证映射的顺序,特别是它不保证该顺序恒久不变. 除了HashMap是非同步以及允许使用null外,HashMap 类与 Hashtable大致相同. 此实现假定哈希函数将元素适当地分布在各桶之间,可为基本操作(get 和 put)提供稳定的性

  • Java中关于二叉树的概念以及搜索二叉树详解

    目录 一.二叉树的概念 为什么要使用二叉树? 树是什么? 树的相关术语! 根节点 路径 父节点 子节点 叶节点 子树 访问 层(深度) 关键字 满二叉树 完全二叉树 二叉树的五大性质 二.搜索二叉树 插入 删除 hello, everyone. Long time no see. 本期文章,我们主要讲解一下二叉树的相关概念,顺便也把搜索二叉树(也叫二叉排序树)讲一下.我们直接进入正题吧!GitHub源码链接 一.二叉树的概念 为什么要使用二叉树? 为什么要用到树呢?因为它通常结合了另外两种数据结

随机推荐