zoukankan      html  css  js  c++  java
  • (后台)详细了解java中的null(转)

    转自CSDN:

    相信大家对于NullPointException 这个让人又爱又恨的不陌生吧..对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰 。今天我们就来谈谈ta,了解ta ,本文有点长,请耐心看下去,对各位肯定是有帮助的

    1、null的起源
    null是Java中的关键字,像public、static、final。它是大小写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错

    Object obj = NULL; // Not Ok
    Object obj1 = null  //Ok

    2、就像每种原始类型都有默认值一样,如int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。Java中的任何引用变量都将null作为默认值。这对所有变量都是适用的,如成员变量、局部变量、实例变量、静态变量(但当你使用一个没有初始化的局部变量,编译器会警告你),如下代码所示:

    private static Object myObj;
    public static void main(String args[]){
        System.out.println("What is value of myObjc : " + myObj);
    }
    1
    What is value of myObjc : null

    3、null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,你也可以将null转化成任何类型,来看下面的代码:

    String str = null; // null can be assigned to String
    Integer itr = null; // you can assign null to Integer also
    Double dbl = null;  // null can also be assigned to Double
     
    String myStr = (String) null; // null can be type cast to String
    Integer myItr = (Integer) null; // it can also be type casted to Integer
    Double myDbl = (Double) null; // yes it's possible, no error

    你可以看到在编译和运行时期,将null强制转换成任何引用类型都是可行的,在运行时期都不会抛出空指针异常。

    4、null可以赋值给引用变量,你不能将null赋给基本类型变量,例如int、double、float、boolean。如果你那样做了,编译器将会报错,如下所示:

    int i = null; // type mismatch : cannot convert from null to int
    short s = null; //  type mismatch : cannot convert from null to short
    byte b = null: // type mismatch : cannot convert from null to byte
    double d = null; //type mismatch : cannot convert from null to double
     
    Integer itr = null; // this is ok
    int j = itr; // 这样转没问题,但是在运行时,会有空指针异常

    正如你看到的那样,当你直接将null赋值给基本类型,会出现编译错误。但是如果将null赋值给包装类object,然后将object赋给各自的基本类型,编译器不会报,但是你将会在运行时期遇到空指针异常。这是Java中的自动拆箱导致的

    5、如果使用了带有null值的引用类型变量,instanceof操作将会返回false

    Integer iAmNull = null;
    if(iAmNull instanceof Integer){
       System.out.println("iAmNull is instance of Integer");                             
     
    }else{
       System.out.println("iAmNull is NOT an instance of Integer");
    }
    iAmNull is NOT an instance of Integer

    这是instanceof操作一个很重要的特性,使得对类型强制转换检查很有用

    6、你可以将null传递给方法使用,这时方法可以接收任何引用类型,例如public void print(Object obj)可以这样调用print(null)。从编译角度来看这是可以的,但结果完全取决于方法。Null安全的方法,如在这个例子中的print方法,不会抛出空指针异常,只是优雅的退出。如果业务逻辑允许的话,推荐使用null安全的方法。

    7、你可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作,例如小于或者大于。跟SQL不一样,在Java中null==null将返回true,如下所示:

    public class Test {
        public static void main(String args[]) throws InterruptedException {
           String abc = null;
           if(abc == null){
               System.out.println("null == null is true in Java");
           }
           if(abc != null){
               System.out.println("null != null is false in Java"); 
           }
        }
    }

    输出:null == null is true in Java
    8、任何一个对象或者一个引用变量为null的时候,这时如果调用其属性或方法,就会出现NullPointException..
    例如:

    public class Test1 {
        public static void main(String[] args) throws ParseException {
            String s = null;    //初始化字符串为null
            System.out.println(s.equals("null"));    //这里调用为null的字符串的equals方法,会报NullPointException
                    String str = new String();
                    System.out.println(str.equals("null"));  //这个调用就没问题,因为new 了一个对象,str不是null,只是对象里面是空壳而已
        }
    }

    第8点在程序中是出现最多的,可能是我们自己定义了一个对象,或者从外部引用了一个对象,却没有发现这个对象是null,然后去调用其属性或者方法的时候,就会出现空指针了,这点切记切记

    9、null的其他用途和注意事项
       (1)释放内存,让一个非null的引用类型变量指向null。这样这个对象就不再被任何对象应用了。等待JVM垃圾回收机制去回收。
        (2)List:允许重复元素,可以加入任意多个null。(这里添加的对象如果为空,拿出来用属性的时候就要注意非空验证了)
                  Set:不允许重复元素,最多可以加入一个null。
                  Map:Map的key最多可以加入一个null,value字段没有限制。
    原文:http://bbs.csdn.net/topics/391824939
  • 相关阅读:
    老调重弹--面向对象设计原则--S.O.L.I.D设计原则
    老调重弹--面向对象设计原则--GRASP设计原则
    【C#版本详情回顾】C#4.0主要功能列表
    【C#版本详情回顾】C#3.0主要功能列表
    【C#版本详情回顾】C#2.0主要功能列表
    .NET Framework和C#版本历史概览
    springmvc RESTful
    springmvc之json交互
    springmvc上传图片
    springmvc异常处理
  • 原文地址:https://www.cnblogs.com/historylyt/p/7910086.html
Copyright © 2011-2022 走看看