JAVA中String = null 与 String = "" 的区别
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 = "" 的区别的更多相关文章
- java中的switch用String作为条件
在开发java程序的过程中,我们遇到了条件推断首选就是switch,可是java中的switch功能不支持字符串作为条件.这时我们该怎么办呢? --使用枚举. 一.枚举简单了解 1.enum是一 ...
- java中main方法的 (String []args)
java中main方法的 (String []args) String[] args是main函数的形式参数,可以用来获取命令行用户输入进去的参数.java 本身不存在不带String ...
- java中int转成String位数不足前面补零
java中int转成String位数不足前面补零 转载自:http://ych0108.iteye.com/blog/2174134 java中int转String位数不够前面补零 String.fo ...
- Java中toString()与new String()
Java中toString()与new String(): 1.错误演示: FileInputStream fileIn = new FileInputStream(filePath);byte[] ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- java中的this与super的区别
java中的this与super的区别 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 代码如下: class Base { Base() { System.out.pr ...
- Java中instanceof和isInstance的具体区别
Java中instanceof和isInstance的具体区别 在Think in Java泛型这一章遇到这个问题,一些博客模糊提到了isInstance是instanceof的动态实现,查阅文档参考 ...
- Java中有关Null的9件事
对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常 (NPE)的骚扰.连Java的发明者都承认这是他的一项巨大失误.Java为什么要保留null呢?null出现有一段时间了,并且我 ...
- java中的sleep()和wait()的区别
对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...
随机推荐
- yhTriangle_LinkQueue(队列实现杨辉三角)
#include"LinkQueue.h" void yhTriangle(int n) { LinkQueue<int> A; int s,t; A.Inqueue( ...
- HTML中表格
HTML表格 [表格table] 表格用table表示,表格中的每一行tr表示,一行中的每一列用td表示 th表示的是:表头.表头中的文字,默认为加粗居中.th要放在tr中,用于替换掉td. [tab ...
- [STM32F429-DISCO-HAL]4.Uart 的使用
今天来学习一下最常用的外设之一USART. 首先是硬件的连接,我们需要至少三根线,GND,TX,RX.参阅datasheet.默认的USART1_TX和USART1_RX的引脚如下图 关于HAL dr ...
- Git 深入浅出
如果你是一个开发人员,想用上这个世界上目前最先进的分布式版本控制系统,那么,赶快开始学习吧!(耐心读下去,收获满满) Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git ...
- Linux操作系统-命令-free
在看过网友写的一篇名为<Buffer和Cache的区别>http://zhumeng8337797.blog.163.com/blog/static/1007689142011102447 ...
- 甲方VS乙方
甲方与乙方,在很多人都存在有误解,不知道究竟如何辨别.这里我提一些简单的辨别方式:甲方一般是指提出目标的一方,在合同拟订过程中主要是提出要实现什么目标,乙方一般是指完成目标,在合同中主要是提出如何保证 ...
- ASP.NET Core 运行原理解剖[1]:Hosting
ASP.NET Core 是新一代的 ASP.NET,第一次出现时代号为 ASP.NET vNext,后来命名为ASP.NET 5,随着它的完善与成熟,最终命名为 ASP.NET Core,表明它不是 ...
- 理解angularJs中的$on,$broadcast,$emit
$emit作用是将一个事件从子作用域广播至父作用域,直至根作用域.(包括自己) $emit有两个参数name和args,name就是需要广播的名字,args是一个或者多个参数. $broadcast的 ...
- VRTK实现瞬移需要添加的脚本
进入一个新的公司,boss让实现漫游,但是新公司的Unity版本是5.6,我之前的瞬移插件不好用了,无奈之下找到一个我不熟悉的插件VRTK,但是查了很多资料也没有实现瞬移.经过自己查脚本与实验终于得到 ...
- JSON异步及跨域
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...