JAVA中String = null 与 String = ""的区别

笔者今天在Debug的时候发现的NPE(NullPointerException),辛辛苦苦地调试了半天,终于看出了究竟

源头就是出在了对String为null的调用上,这时会抛出NullPointerException

首先,笔者在前面的博客中提到了对字符串进行比较的方法。传送门,通过先阅读这篇文章,可能对以后的理解更有帮助。


下面介绍几个比较常见的错误写法

if(str == "")
{
//
}

因为==操作在对String这种引用数据类型来说,比较的是地址,两者的地址不同,所以这种写法的if语句永远不会被执行。

if(str.equal(""))
{
//
}

这种写法也有可能出错,如果当str=null时,对它进行调用就会抛出NullPointerException异常。

所以正确的写法如下:

if(str!=null&&str.equal("something")
{
//
} 或者 if(!"something".equal(str))
{
//这种写法,如果你没有给str赋初值,编辑器会提示你
//如果str==null,那么这个if会被执行
}

这两种写法亲测实用,并且更安全。


说完了一些例子,下面让我来说一下他们的真正的区别吧

String str1 = null;		//str1引用为空,它没有地址,它是一个没有被实例化的对象

String str2 = "";		//str引用为空字符串,它有地址,它是被实例化的对象,值为空而已。

总结来说

所以说对str1进行比较时要用==操作,如果使用str1.equal()则会抛出NullPointerException

对str2进行比较时要用str2.equal(),如果使用str2=="你想要比较的字符串",这个boolean值永为false

update by 2017/3/30 19:42

by 一枝猪

JAVA中String = null 与 String = "" 的区别的更多相关文章

  1. java中的switch用String作为条件

    在开发java程序的过程中,我们遇到了条件推断首选就是switch,可是java中的switch功能不支持字符串作为条件.这时我们该怎么办呢? --使用枚举. 一.枚举简单了解    1.enum是一 ...

  2. java中main方法的 (String []args)

    java中main方法的 (String []args)         String[] args是main函数的形式参数,可以用来获取命令行用户输入进去的参数.java 本身不存在不带String ...

  3. java中int转成String位数不足前面补零

    java中int转成String位数不足前面补零 转载自:http://ych0108.iteye.com/blog/2174134 java中int转String位数不够前面补零 String.fo ...

  4. Java中toString()与new String()

    Java中toString()与new String(): 1.错误演示: FileInputStream fileIn = new FileInputStream(filePath);byte[] ...

  5. Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)

    Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例  原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...

  6. java中的this与super的区别

    java中的this与super的区别 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 代码如下: class Base { Base() { System.out.pr ...

  7. Java中instanceof和isInstance的具体区别

    Java中instanceof和isInstance的具体区别 在Think in Java泛型这一章遇到这个问题,一些博客模糊提到了isInstance是instanceof的动态实现,查阅文档参考 ...

  8. Java中有关Null的9件事

    对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...

  9. java中的sleep()和wait()的区别

    对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...

随机推荐

  1. 利用C#进行Socket通信编程之二:一个实例

    本文转载自: http://blog.csdn.net/huangxinfeng/article/details/4967629/

  2. CentOS Linux 系统 安装oracle 11g

    CentOS Linux 系统 安装oracle 11g 在Linux系统上安装oracle是比较麻烦,需要配置各种变量啥的,o(︶︿︶)o ,但是没办法,有些东西你总的去接触,而且接触理解的越早越深 ...

  3. [BZOJ 3629][ JLOI2014 ]聪明的燕姿

    这道题考试选择打表,完美爆零.. 算数基本定理: 任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积N=P₁^a₁ P₂^a₂…Pn^an,这里P₁<P₂<…<Pn均为质数, ...

  4. hadoop生态圈列式存储系统--kudu

    介绍 Kudu 是一个针对 Apache Hadoop 平台而开发的列式存储管理器.Kudu 共享 Hadoop 生态系统应用的常见技术特性: 它在 commodity hardware(商品硬件)上 ...

  5. JDK、Eclipse、Myeclipse、Tomcat等各种软件的版本详解(写给对版本和兼容性问题焦头烂额的你)

    这篇文章我们来探讨一下关于JDK.Eclipse.Myeclipse.Tomcat的版本问题.一.关于版本的几个概念1.32位和64位两个版本:    简言之,64位的操作系统支持识别4G以上的内存条 ...

  6. C/C++ 知识点---字符串函数

    1.strcpy字符串拷贝2.strcmp字符串比较3.strstr字符串查找4.strDelChar字符串删除字符5.strrev字符串反序6.memmove拷贝内存块7.strlen字符串长度 - ...

  7. node.js之require

    1.require.resolve('./testModeule.js')在REPL运行环境下输入,可以查询到当前目录下textModeule.js模块文件的完整文件名 2.require.cache ...

  8. js 小数计算为啥和想象中不一样!

    今天遇到了一个比较有趣的事,如果要你计算0.1+0.2等于多少你会怎么回答? "0.3啊!"你可能都不会考虑.我也一样,当a=0.1,b=0.2时 if(a+b === 0.3){ ...

  9. 常用的Linux发行版

    Linux发行版百花齐放 [内容摘要] 如今,众多的Linux发行版百花齐放,linux的阵营日益壮大,每一款发行版都拥有一大批用户,开发者自愿为相关项目投入精力.Linux发行版可谓是形形色色,它们 ...

  10. linux虚拟机ip地址更改

    在虚拟机模式下 进入 cd /etc/sysconfig/network-scripts/ vim ifcfg-eth0 编辑 IPADDR=新的内网ip PREFIX  = 24 (对应255.25 ...