Java中String判断值为null或空及地址是否相等的问题

String的null或空值的判断处理
笔者在开发过程中,常常碰到过下面这些错误的用法:
1,错误用法一:

if (name == "") {
//do something
}

2,错误用法二:

if (name.equals("")) {
//do something
}

3,错误用法三:

if (!name.equals("")) {
//do something
}

我们来解说一下:
上述错误用法1是初学者最容易犯,也最不容易被发现的错误,因为它们的语法本身没问题,Java编译器编译时不报错。但这种条件可能在运行时导致程序出现bug,永远也不会为true,也就是时说,if块里的语句永远也不会被执行。

上述用法二,用法三 的写法,是包括很多Java熟手也很容易犯的错误,为什么是错误的呢?也许你会感到纳闷。
对,它们的写法本身没错,但是,少了一个null判断的条件,试想,如果name=null的情况下,会发生什么后果呢?后果是,你的程序将抛出NullPointerException异常,系统将被挂起,不再提供正常服务。
当然,如果之前已经对name作了null判断的情况例外。

正确的写法应该先加上name != null的条件,如例:

if (name != null && !name.equals("")) {
//do something
}

或者

if (!"".equals(name)) {//将""写在前头,这样,不管name是否为null,都不会出错。
//do something
}

下面,我们举一个简单的例子:

TestNullOrEmpty.java

public class Test {
  public static void main (String args[]){
    String value = null;
    testNullOrEmpty(value);

    value = "";
    testNullOrEmpty(value);

    value = " ";
    testNullOrEmpty(value);

    value = "hello me";
    testNullOrEmpty(value);
  }

  static void testNullOrEmpty(String value){
    if(value == null){
      System.out.println("value is null");
    } else if ("".equals(value)){
      System.out.println("value is blank but not null");
    } else {
      System.out.println("value is \"" + value + "\"");
    }

    if (value == "") { //NG 错误的写法
      //别用这种写法
    }
  }
}

编译执行:

c:\>javac TestNullOrEmpty.java

c:\>java TestNullOrEmpty
value is null.
value is blank but not null.
value is " "
value is "hello me!"

比较String地址相等

package com; 

public class A
{ 

  /**
   * @param args
   */
  public static void main(String[] args)
  { 

    String a = "hello";
    String b = "he";
    String c = a.substring(0, 2);
    System.out.println(b.equals(c));//true
    System.out.println(b==c);//false 

    String d = new String("hello");
    System.out.println(d.equals(a));//true
    System.out.println(d==a);//false 

    String e = new StringBuilder("hello").toString();
    System.out.println(e.equals(a));//true
    System.out.println(e==a);//false 

    System.out.println(e.equals(d));//true
    System.out.println(e==d);//false 

    String f = "hello";
    System.out.println(f.equals(a));//true
    System.out.println(f==a);//true
    System.out.println(f=="hello");//true
    System.out.println(f=="hell"+"o");//true 

    String g = b+"llo";
    System.out.println(g==f);//false 

    String h = "he"+"llo";
    System.out.println(h==f);//true
  } 

}

总结:

1.new出来的String是重新分配内存,字符串不共享,new出来的多个之间也不共享。

2.通过字符串函数操作拼接或者截取到的字符串跟静态字符串变量也是不共享的。

3.通过加号得到的字符串有两种情况。

A   "he"+"llo"是静态字符串,是共享的
B   String a = "He";  a+"llo"不是静态字符串,是不共享的

时间: 2016-01-25

java String 类的一些理解 关于==、equals、null

1.String 的==与equal() 在对字符串的相等判断,==判断的是地址是否相同,equal()判断的是字符值是否相同.大多数时候==跟equal()的结果都是相同的.这是因为String对象是不变模式的,如果你不是明确地new一个String对象,Java对于String对象的保存默认的是会把新生成的String 对象放到一个缓冲区,然后每次判断缓冲区中是否已经有了这个对象,如果有了,那么后建立的同样字符值的String对象也会指向最初建立是该字符值对象的地址.也就是说字符值相同的时候

Java String转换时为null的解决方法

开发中经常遇到从集合类List.Map中取出数据转换为String的问题,这里如果处理不好,经常会遇到空指针异常java.lang.NullPointerException,在此总结一下常用转换为String的方法,以及转换后如何对其进行判null使用的问题. Java中对象转换为String的常用方法: 方法一:String  objStr  =  (String) obj: 强制类型转换,对象obj为null,结果也为null,但是obj必须保证其本质是String类型的值,即可转换的值.

基于java时区转换夏令时的问题及解决方法

一.准备知识 1.America/New_York的夏令时时间如下: 包左不包右 2016-3-13, 02:00:00到2016-11-6, 02:00:00 2017-3-12, 02:00:00到2017-11-5, 02:00:00 2.三字母时区 ID 为了与 JDK 1.1.x 兼容,一些三字母时区 ID(比如 "PST"."CTT"."AST")也受支持. 但是,它们的使用被废弃,这是因为相同的缩写经常用于多个时区 例如 CST:有

java表单提交中文乱码的解决方法

本文实例为大家分享了java表单提交中文乱码的解决方法,供大家参考,具体内容如下 主页index.xml <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <html> <head> <title>servlet演示</title> </head> <body> <h2&

SpringBoot的拦截器中依赖注入为null的解决方法

该项目是基于SpringBoot框架的Maven项目. 今天在拦截器中处理拦截逻辑时需要使用注解调用其他方法 并且要从配置文件中读取参数.所以我使用了以下注解: @Reference CoreRedisService redisService; @Value("${channel}") private String channel; @Value("${allowMethod}") private String allowMethod; 一个是获取接口的引用,两外两

PHP处理Json字符串解码返回NULL的解决方法

本文实例讲述了PHP处理Json字符串解码返回NULL的解决方法.分享给大家供大家参考之用.具体方法如下: 一般来说,php对json字符串解码使用json_decode()函数,第一个参数传字符串,第二个参数若为true,返回array:若为false,返回object.如果返回NULL,说明报错,输出json_last_error(),得到的整数值对应错误提示.如下图所示: json_last_error()比较常见的是整数4, 是json字符串在json_decode之前已不完整,所以语法

Android开发中R.java文件丢失或无法更新的解决方法

本文分析了Android开发中R.java文件丢失或无法更新的解决方法.分享给大家供大家参考,具体如下: 首先确定你的SDK是新的. 其次接下来检查你的.xml文件,文件名不能大写. 如果xml文件太多 ,那么clean一下你的项目,这时候注意看Console的提示. Console会提示你xml文件错误在哪里 修改完xml文件之后 clean你的项目,再build你的项目 R.java会重新出现或更新 Android 在开发中会自动生成一个 R.java 文件 ,这个文件是自动生成的,最好不要

vue-cli webpack模板项目搭建及打包时路径问题的解决方法

这里建议刚学vue的同学第一个小案例不要使用vue-cli进行操作,待对基本的api使用的比较顺手了之后再进行vue-cli的体验比较好.本人是一名后端开发人员,接触前端时间不长,这里有说的不好的地方,还请大家评论建议下. 1. 安装必要的环境准备 首先我们要能够暗转node.js,这个环境.百度搜索node,进入官网根据自己的操作系统进行下载即可.现在的版本都是自带npm的了.所以安装后,环境变量正常情况下会自动配置,开启一个命令行终端,输入node,npm,就可以看到相应的信息.那么说明安装

thinkPHP使用post方式查询时分页失效的解决方法

本文实例讲述了thinkPHP使用post方式查询时分页失效的解决方法.分享给大家供大家参考,具体如下: 昨天晚上一直没有解决的php项目中的bug,就在刚才终于搞定,在这里还需要感谢各位大神给的帮助! 具体问题描述 最近遇到一个非常棘手的问题,也是因为刚入手thinkphp.在做项目的过程中,因为需要非常多的查询条件,如果以get方式提交表单的话,会因为url长度限制而报错,所以必须使用post方式提交表单数据,但是在分页的过程中,遇到了问题,因为thinkphp自带的分页是以a标签的形式,进

Json_decode 解析json字符串为NULL的解决方法(必看)

从APP端或从其他页面post,get过来的数据一般因为数组形式.因为数组形式不易传输,所以一般都会转json后再发送.本以为发送方json_encode(),接收方json_decode(),就解决的问题,结果发现,json_decode()后是NULL. 一般会反应是少了一个参数"true",但是回去看就是 json_decode($data,true); 那怎么还会是NULL呢?难道是编码,不会啊,接收后直接打印是一个完整json字符串的形式,在网上json解析网站,也是可以正常

java使用sigar 遇到问题的快速解决方法

先给大家介绍一个开源工具Sigar 官网:http://sigar.hyperic.com/ API: http://www.hyperic.com/support/docs/sigar/index-all.html(由于是英文的,英文不好的可以用谷歌浏览器的翻译功能,直接转换为简体中文进行阅读) Sigar(System Information Gatherer And Reporter),是一个开源的工具,提供了跨平台的系统信息收集的API,由C语言实现的.可以收集的信息包括: 1 CPU信