Long.getLong()中枪留念

  getLong(String str ) 与 valueOf(String str) 都是Long 这个类中的方法,它们的返回值都是Long ,传入的参数都是 String 。看这字面的意思好像都是将字符串变为Long 类型的数据。
    先上一个例子:

package hlm.com;
public class TestLong {
      public static void main(String[] args ) {
           String lstr = "12" ;
           Long l1 = Long. getLong (lstr );
           Long l2 = Long. valueOf ( lstr );
           System. out .println( l1 );
           System. out .println( l2 );
      }
}


    运行结果:

null
12

    valueOf(String str)这个方法如我们想像的一样,它是将我们传入的数据字符串成功地转成了Long 类型的数据。但getLong(String str )却失败了。
    我们先来看valueOf(String str)。

  public static Long valueOf (String paramString )
    throws NumberFormatException
  {
    return valueOf ( parseLong ( paramString , 10));
  }
    其实它是调了parseLong(String,int )这一方法的,那么我们就看parseLong(String,int )
public static long parseLong (String paramString , int paramInt )
    throws NumberFormatException
  {
    if ( paramString == null ) {
      throw new NumberFormatException( "null" );
    }
    if ( paramInt < 2) {
      throw new NumberFormatException( "radix " + paramInt + " less than Character.MIN_RADIX" );
    }
    if ( paramInt > 36) {
      throw new NumberFormatException( "radix " + paramInt + " greater than Character.MAX_RADIX" );
    }
    long l1 = 0L;
    int i = 0;
    int j = 0;
    int k = paramString .length();
    long l2 = -9223372036854775807L;
    if ( k > 0)
    {
      int n = paramString .charAt(0);
      if ( n < 48)
      {
        if ( n == 45)
        {
          i = 1;
          l2 = Long. MIN_VALUE ;
        }
        else if ( n != 43)
        {
          throw NumberFormatException. forInputString ( paramString );
        }
        if ( k == 1) {
          throw NumberFormatException. forInputString ( paramString );
        }
        j ++;
      }
      long l3 = l2 / paramInt ;
      while ( j < k )
      {
        int m = Character. digit ( paramString .charAt( j ++), paramInt );
        if ( m < 0) {
          throw NumberFormatException. forInputString ( paramString );
        }
        if ( l1 < l3 ) {
          throw NumberFormatException. forInputString ( paramString );
        }
        l1 *= paramInt ;
        if ( l1 < l2 + m ) {
          throw NumberFormatException. forInputString ( paramString );
        }
        l1 -= m ;
      }
    }
    else
    {
      throw NumberFormatException. forInputString ( paramString );
    }
    return i != 0 ? l1 : - l1 ;
  }


    parseLong(String,int )这一方法就是按传入的字符串及进制数来将字符串转为long这一基础类型数据(具体算法下次再讨论),然后valueOf(String str)将其包装成Long 这一类型。期间还有大家面试题 中常见到的new Long 时127及以下的数据怎么new 用==都能得到true ,就是因为127及以前的数据都是先new 好然后再从cahe 中取的,valueOf把long 变为Long 时也是这么干的。

    再来说 getLong(String str ),我们都被它的外表,这家伙根本跟我们想的就不一样

public static Long getLong (String paramString , Long paramLong )
  {
    String str = null ;
    try
    {
      str = System. getProperty ( paramString );
    }
    catch (IllegalArgumentException|NullPointerException localIllegalArgumentException ) {}
    if ( str != null ) {
      try
      {
        return decode ( str );
      }
      catch (NumberFormatException localNumberFormatException ) {}
    }
    return paramLong ;
  }


    大家注意这一句

str = System. getProperty ( paramString );


    这才是它的根本。它就是获取系统属性的。什么是系统属性,看下例子大家就明白了

public class TestLong {
      public static void main(String[] args ) {
          System. out .println(System. getProperty ( "os.name" ));
          System. out .println(System. getProperty ( "java.version" ));
     }
}


    运行结果为

Windows 7
1.8.0_162

    这就是系统属性。getLong(String str )就是将系统属性的字符串转为Long 类型数据。我们前面的“12”根本不是系统属性,所以转不了为null很正常。
    “ java.version”这个虽然是系统属性了,但它的字段串是“ 1.8.0_162”,也是转不了,都不是标准的数。所以,这是一个很蛋疼的方法。个人感觉写在这里就是用来误导人的。很少的属性值会是标准数字,退一万步就,如果我知道这个系统属性值是个纯数字,我也会直接System.getProperty()然后再转为Long 。打死也不会想到Lomg 中的getLong(String str )这个方法有这效果。很格格不入啊。
————————————————
版权声明:本文为CSDN博主「mottohlm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mottohlm/article/details/80767266

你可能感兴趣的:(java,api)