Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中null的行为_Java_Nullpointerexception_Null_Concatenation - Fatal编程技术网

Java中null的行为

Java中null的行为,java,nullpointerexception,null,concatenation,Java,Nullpointerexception,Null,Concatenation,这可能与其他问题类似。但是,我想知道Java如何处理null 例如: 注释第3行打印n,而取消注释则抛出NullPointerException。如果我对第1行和第2行没有错的话,那么它是隐式类型转换为字符串的。但是,3号线怎么办 拆箱发生。整数没有+运算符。必须将其解绑到int原语。字符串在Java中有很多特殊的余量,无论好坏。该规范规定,当转换为字符串时,null将被转换为字符串null,例如,通过字符串连接隐式调用其他操作数上的toString。因此,根据语言规范的说法,将null添加到字

这可能与其他问题类似。但是,我想知道Java如何处理null

例如:


注释第3行打印n,而取消注释则抛出NullPointerException。如果我对第1行和第2行没有错的话,那么它是隐式类型转换为字符串的。但是,3号线怎么办

拆箱发生。整数没有+运算符。必须将其解绑到int原语。

字符串在Java中有很多特殊的余量,无论好坏。该规范规定,当转换为字符串时,null将被转换为字符串null,例如,通过字符串连接隐式调用其他操作数上的toString。因此,根据语言规范的说法,将null添加到字符串中是可行的

基于此,您的前两行将导致

w.x = "null" + "null";
w.x = "nullnull" + "null" + "null";
在第3行中,您会看到一种不同的现象,在本例中是自动装箱和取消装箱。为了简化基本类型和它们各自的包装类之间的分离,您可以对包装类应用算术运算符,这将提示对它们的值进行取消装箱、操作,并再次装箱结果。这就是NullReferenceException发生的地方,因为w.z仍然是null,因此不能取消绑定。实质上:

w.z = w.z + w.z
由编译器转换为:

w.z = Integer.valueOf(w.z.intValue() + w.z.intValue());
调用intValue失败了,因为这里的w.z为null


在Java 5之前,如果您想对整数对象进行计算,这是您必须自己编写的。

在Java中,参考默认值为null。当您声明了z但未初始化时,由于z是一个引用变量,所以它的默认值将为null。因此您得到了NullPointerException

有两种方法可以避免NullPointerException

初始化z

public class Work {
    String x = null;
    String y;
    Integer z = 0;   

    public static void main(String arg[]) {
        Work w = new Work();
        w.x = w.x + w.y; // work Line 1
        w.x = w.x + w.y + w.z; // work Line 2
        w.z = w.z + w.z; // work Line 3 
        System.out.println(w.x.charAt(4));
    }
}
重新分配时使用IT i的值

w、 z=null==w.z?0:Integer.valueOfw.z.intValue+w.z.intValue


但是,3号线怎么办?将整数解装箱为int。第2行呢?尝试将Integer和Strings连接起来您已经知道了,那么您的问题是什么呢?我的假设是,它被类型转换为String。但是,正如您提到的Integer,它被取消绑定为int。那么,在这种情况下,它应该显示Null0。正当因为int的默认值是0。是的,int的默认值是0,但您没有int。
public class Work {
    String x = null;
    String y;
    Integer z = 0;   

    public static void main(String arg[]) {
        Work w = new Work();
        w.x = w.x + w.y; // work Line 1
        w.x = w.x + w.y + w.z; // work Line 2
        w.z = w.z + w.z; // work Line 3 
        System.out.println(w.x.charAt(4));
    }
}