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

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"不是静态字符串,是不共享的

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索java
, string
, null
, 空值
地址相等
string null 判断、c string null 判断、判断string是否为null、string为null 判断、java string判断null,以便于您获取更多的相关知识。

时间: 2024-09-14 03:10:20

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

Java中String类(字符串操作)的10个常见问题和解决方法_java

本文介绍Java中关于String最常见的10个问题: 1. 字符串比较,使用 "==" 还是 equals() ?简单来说, "==" 判断两个引用的是不是同一个内存地址(同一个物理对象).而 equals 判断两个字符串的值是否相等.除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法.如果你了解 字符串的驻留 ( String Interning ) 则会更好地理解这个问题 2. 对于敏感信息,为何使用char[]要比Stri

字符串-java中String究竟是传递的值,还是引用

问题描述 java中String究竟是传递的值,还是引用 很多人说,java中的String虽然是对象,但是具有值类型的特征.他是值传递,传递的值. 我认为这这种说法完全是错误的. String和普通对象毫无区别,和其他对象一样,传递的是引用,而不是值. 一段String的运用代码: String a = "123"; public void change(String a){ a = "234"; } 很多人会说,a的值没有变,是因为String是值传递,问题是,

java中String的一些方法深入解析

以下是对java中String的一些方法进行了详细的分析介绍,需要的朋友可以参考下   1.public String(char[] c,begin,length).从字符数组c的下标begin处开始,将长度为length的字符数组转换为字符串. begin与length可以省略,即将字符数组c转换为字符串.另:字符数组可改为字节数组byte[] b.char[] c=new char[]{'j','y','6','a','4','t','9'}; String s1=new String(c)

代码分析-Java中如何判断文件夹下当天有没有放文件?

问题描述 Java中如何判断文件夹下当天有没有放文件? List files = ftpUtil.getFileList(this.ftpTaskFolder);//ftp任务目录上获取任务文件 // 获取机构号全量数据传输任务文件 String organcodeFileName = """"; for (int i = 0; files != null && i < files.size(); i++) { String tempFileN

java中string可以作用于switch吗?

问题描述 java中string可以作用于switch吗? switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 很多回答都是不能,但是关于string的问题,为什么可以呢? String s="1"; switch(s){ case "1": } 这要是没问题的呢?为什么呢 解决方案 这是编译器规定的.因为switch的判断的代码是编译器硬编码实现的,因此编译器对于内置类型,理论上想实现,都可以实现. 解决方案二: jdk1.7中

区分java中String+String和String+char_java

我们来考虑一个关于java中String的问题: "abc" + '/'和 "abc" + "/"的区别. 通过这个例子, 我们可以顺便练习一下JDK工具中javap的用法, 原问题是这样的: 把斜杠/当作字符或字符串有什么区别呢? 一个是当作基本数据类型char,一个是对象String.具体有什么区别呢? 当作字符效率会更高吗?String str = "abc" + '/';和String str = "abc&

java中hasNextInt判断后无限循环输出else项的解决方法_java

话不多说,上来就是干! ?12345678910111213141516171819202122232425262728293031323334353637 import java.util.Scanner; public class Test_hasNextInt { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new

java中 String类常量池

java中 String类常量池 String常量池详解: 1.String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能再修改此对象中存储的字符串内容,就是因为如此,才说String类型是不可变的(immutable).String类有一个特殊的创建方法,就是使用""双引号来创建.例如new String("i am")实际创建了2个 String对象,一个是"i am"通过

java 中 String.indexOf(string) 就是找不到,明明存在在文件中 。求助?

问题描述 java 中 String.indexOf(string) 就是找不到,明明存在在文件中 .求助? 我从网站或文件中读取一个文档,存储在一个String str中:比如此时我要查找一个 子字符串 substr 用 indexOf方法返回的为-1 但是在str中确实存在substr 在记事本或网页中可以查找到.把str 输出到console中也是存在 substr的求帮忙分析下原因?解决方法?谢谢 解决方案 大小写.全角半角.隐藏的空格或者特殊字符等细节检查下,还有,访问的是不是你期待的