GVKun编程网logo

String.valueOf(null) 遇到的坑(string.valueof方法 null)

8

以上就是给各位分享String.valueOf(null)遇到的坑,其中也会对string.valueof方法null进行解释,同时本文还将给你拓展(String)、toString、String.v

以上就是给各位分享String.valueOf(null) 遇到的坑,其中也会对string.valueof方法 null进行解释,同时本文还将给你拓展(String)、toString、String.valueOf的区别、asp.net中DBNull.Value,null,String.Empty区别浅析、Blank与Empty差异(String.valueof()引发的null字符串验证跳过)、Enum.valueOf(String)方法从何而来?等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

String.valueOf(null) 遇到的坑(string.valueof方法 null)

String.valueOf(null) 遇到的坑(string.valueof方法 null)

说说关于String.valueOf的这个坑。

 public class TestString {
     
     public static void main(String[] args){ 
         Object obj = null;
         System.out.println(String.valueOf(obj));
         System.out.println(String.valueOf(null));
     }
 }

这段代码,第一个输出“null”,没错,不是空对象null也不是空串“”,而是一个字符串!!包含四个字母n-u-l-l的字符串...

第二个输出,咋一看没差别,但是,第二个输出,抛空指针异常了。

下面来分析分析原因。

先说第一个:

看第一个的源码实现:

    /**
     * Returns the string representation of the <code>Object</code> argument.
     *
     * @param   obj   an <code>Object</code>.
     * @return  if the argument is <code>null</code>, then a string equal to
     *          <code>"null"</code>; otherwise, the value of
     *          <code>obj.toString()</code> is returned.
     * @see     java.lang.Object#toString()
     */
      public static String valueOf(Object obj) {
           return (obj == null) ? "null" : obj.toString();
      }

源码很简单,如果对象为空,就返回字符串的"null"...不为空就调用toString方法。

再来说第二个:

第二个和第一个的不同,是java对重载的不同处理导致的。

基本类型不能接受null入参,所以接受入参的是对象类型,如下两个:

String valueOf(Object obj)

String valueOf(char data[])

这两个都能接受null入参,这种情况下,java的重载会选取其中更精确的一个,所谓精确就是,重载方法A和B,如果方法A的入参是B的入参的子集,则,A比B更精确,重载就会选择A。换成上面这两个就是,char[]入参的比object的更精确,因为object包含char[],所以String.valueOf(null)是用char[]入参这个重载方法。

看看这个方法的实现:

     /**
       * Returns the string representation of the <code>char</code> array
       * argument. The contents of the character array are copied; subsequent
       * modification of the character array does not affect the newly
       * created string.
       *
       * @param   data   a <code>char</code> array.
       * @return  a newly allocated string representing the same sequence of
       *          characters contained in the character array argument.
       */
      public static String valueOf(char data[]) {
        return new String(data);
      }

直接new String的,再看new String的实现:
 

   /**
     * Allocates a new {@code String} so that it represents the sequence of
     * characters currently contained in the character array argument. The
     * contents of the character array are copied; subsequent modification of
     * the character array does not affect the newly created string.
     *
     * @param  value
     *         The initial value of the string
     */
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
    }

第12行,入参为null,null.length就报NPE了。

大家用的时候养成多看源码实现的好习惯,可以避免踩坑...

(String)、toString、String.valueOf的区别

(String)、toString、String.valueOf的区别

  

  在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能。本文将对常用的转换方法进行一个总结。

      常用的方法有:(String)要转换的对象,Object#toString(),String.valueOf(Object)等。

 

  一、(String)

  • 这是标准的类型转换,将object转成String类型的值。使用这种方法时,需要注意的是类型必须能转成String类型。因此最好用instanceof做个类型检查,以判断是否可以转换。否则容易抛出CalssCastException异常。此外,需特别小心的是因定义为Object 类型的对象在转成String时语法检查并不会报错,这将可能导致潜在的错误存在。这时要格外小心。如: 
  • Object obj = new Integer(100);
    String strVal = (String)obj;
  • 在运行时将会出错,因为将Integer类型强制转换为String类型,无法通过。

    

  

  二、toString

  • 在这种使用方法中,因为java.lang.Object类里已有public方法.toString(),所以对任何严格意义上的java对象都可以调用此方法。但在使用时要注意,必须保证object不是null值,否则将抛出NullPointerException异常。采用这种方法时,通常派生类会覆盖Object里的toString()方法。

        

    

 

  三、String.valueOf

  • 这个方法是静态的,直接通过String调用,可以说是完美,只是平时不习惯这样写而已,这样的实现避免了前面两个的不足和缺点。首先来看看他内部的实现机制:
  • public static String valueOf(Object obj){
        return (obj==null) ? "null" : obj.toString()
    };

     在内部就是做了为空的判断的,所以就不会报出空指针异常。  

  • 从上面的源码可以很清晰的看出null值不用担心的理由。但是,这也恰恰给了我们隐患。我们应当注意到,当object为null 时,String.valueOf(object)的值是字符串”null”,而不是null!!!在使用过程中切记要注意。

    试想一下,如果我们用

  • if(String.valueOf(object)== null){
        System.out.println(“传入的值是null!”);
    }
  • 这样的语句将可能会发生什么问题。再想一下,向控制台输出时,在视觉上如下语句在执行的结果上有什么不同:
  • Object obj = null;
    System.out.println(String.valueOf(obj) + "->此处null的类型是" + String.valueOf(obj).getClass());
    System.out.println(obj);

    我们看到的输出将是一模一样的东西:null,但它们意义相同吗?

        

 

  四、总结
  这三者的使用,个人觉得应该使用String.valueOf()的方式。这样的使用安全可靠,不会带来异常。

 

 

  转载自:https://www.cnblogs.com/xhyouyou/p/6014367.html

 

asp.net中DBNull.Value,null,String.Empty区别浅析

asp.net中DBNull.Value,null,String.Empty区别浅析

首先,“null”是C#中(VB.NET为Nothing),表示某个引用对象变量“未引用”任何实体时候的状况(典型症状是如果调用这个变量的某个方法,会抛出NullException之类的异常)。

String.Empty是一个静态的公共变量,表示某String变量不包含任何字符(等同于"")。不过从性能上说,用String.Empty比声明用一个""好一些——显然地,前者是String类的静态变量,无论如何使用只产生一个实例,后者用几次恐怕要产生几次了。

复制代码 代码如下:

string str="";

//“”:表示在栈中分配了数据引用存储区域,并在堆中创建了实际数据存储区域,并将引用地址赋给了变量,在堆中分配了一个长度为空的存储空间。

string str=string.Empty;

//string.Empty: 表示在栈中分配了数据引用存储区域,并在堆中创建了用于实际数据存储的区域,并将引用地址赋给了变量,但在堆中创建的存储空间未分配或未存储数据。


至于DBNull.Value,也是一个静态属性。它唯独用于数据库(例如使用DataReader读取数据的时候,又或者是DataTable中某行某列数据的比较时候)的“空数值”比较。因为在SQL中某个字段为Null只是说明该字段“没有任何值”,并不是C#中“不存在引用”。因此注意这些问题:

1)如果用DataReader执行ExecuteScalar,如果你不确定是否会获取数据,必须采用null进行判断(因为空引用);如果你确信读取至少一条数据,但是不确定是否数据为空,可以使用DBNull.Value进行数值判断。

2)承接1,如果某条字段确信没有任何数据,等同于没有任何字符,等同于String.Empty和"",因此完全可以用String.Empty或者""进行判断(重要结论:DbNull.Value=String.Empty="")。

3)另外,如果对string类型的DataColumn进行赋值(譬如赋值为null),既便如此,实际上在DataTable中不可能存一个null(为了和SQL实际数值对应),会转化成String.Empty或者是""。判断方法同“重要结论”。

简单地说:

string str ="";

给你一张白纸;

string str = null;

连白纸也没有。

string.Empty就相当于""

一般用于字符串的初始化

比如:

复制代码 代码如下:

string a;

Console.WriteLine(a);//这里会报错,因为没有初始化a


而下面不会报错:
复制代码 代码如下:

string a=string.Empty;

Console.WriteLine(a);


或者用于比较:
复制代码 代码如下:

if(a=="")

if(a==string.Empty)


上面两句是一样的效果。

string.Empty不分配存储空间

""分配一个长度为空的存储空间

所以一般用string.Empty

为了以后跨平台,还是用string.empty

在 C# 中,大多数情况下 "" 和 string.Empty 可以互换使用。比如:

复制代码 代码如下:

string s = "";

string s2 = string.Empty;

if (s == string.Empty) {

//
}


if语句成立

判定为空字符串的几种写法,按照性能从高到低的顺序是:

s.Length == 0 优于 s == string.Empty 优于 s == ""

您可能感兴趣的文章:

Blank与Empty差异(String.valueof()引发的null字符串验证跳过)

Blank与Empty差异(String.valueof()引发的null字符串验证跳过)

isBlank()函数和isEmpty()函数是java中验证非空数据最长用的判断方式,不过两种函数在针对空格字符串上存在差异

1、空格字符串:

输出结果:aaa是空字符串,并且长度为3
                  aaa不是空字符串

isBlank判断为空,isEmpty判断为非空

对于空字符和null字符串判断,isBlank()和isEmpty()返回都是一致的

2、空字符串

3、null字符串

 

附注:

在使用String.valueOf()函数处理数据,会返回null字符串,isNotBlank()函数和isNotEmpty()函数校验会跳过,封装结果数据会出现null值,判断时需要加上null字符串的校验!!!

Enum.valueOf(String)方法从何而来?

Enum.valueOf(String)方法从何而来?

在Java SE 7中(并且很可能在以前的版本中),Enum类的声明如下:

 public abstract class Enum<E extends Enum<E>>
 extends Object
 implements Comparable<E>,Serializable

Enum类具有带有此签名的静态方法:

  T static<T extends Enum<T>> valueOf(Class<T> enumType,String name)

但是没有静态方法:valueOf(String)在Enum类中定义,也不在Enum所属的层次结构中。

问题是valueOf(String)从哪里来的?它是语言的功能,即编译器中内置的功能吗?

今天关于String.valueOf(null) 遇到的坑string.valueof方法 null的介绍到此结束,谢谢您的阅读,有关(String)、toString、String.valueOf的区别、asp.net中DBNull.Value,null,String.Empty区别浅析、Blank与Empty差异(String.valueof()引发的null字符串验证跳过)、Enum.valueOf(String)方法从何而来?等更多相关知识的信息可以在本站进行查询。

本文标签:

上一篇Python | Flask 解决跨域问题(flask跨域怎么解决)

下一篇如何使用 Apache Flume 发送日志数据至 Apache Pulsar(flume收集日志到hdfs)