Java和甜蜜的科学

当您使用Java进行开发已有15年并且同事要求您帮助他们调试空指针异常时,您不会感到惊讶。 通常,很明显什么是null,唯一要做的就是找出原因。

有时会有些困难,因为有人创建了一系列取消引用的对象。 前几天,我遇到了一些新东西,并感到困惑了一段时间。 用Java调试最简单的事情之一就是一时的神秘感。

考虑下面的代码,并告诉我空指针异常在哪里:

return value;

没错,NPE被抛出一个简单的return语句。

怎么会这样 没有明显的取消引用。 没有引用为空。 那句话很简单。 让我稍微扩展一下代码视图,以便您更好地了解发生了什么:

public int getValue(){
		return value;
	}

再一次,我们正在看非常简单的代码。 在上面的代码和文章标题中的提示之间,您可能已经知道发生了什么,或者您可能更加困惑。 再次没有明确地取消引用。 不仅我们甚至没有处理引用,它还返回一个原语。

您从线索中找出来了吗? 好的,这是其余的代码和说明:

package Example;
public
 class Example {
	Integer value;
	public int getValue(){
		return value;
	}
}

注意,value是一个以大写I表示的Integer,而getValue返回int。

在Java 5之前的过去,您会在上述代码上遇到编译错误。 但是Java 5引入了自动装箱 。 这个功能在我的Java职业生涯中已经存在了将近一半,并且从未使我感到困惑或困惑。 它一直是一个方便的功能。

自动装箱允许在基元及其等效的第一类对象之间进行无缝转换。 因此,您无需分配value.intValue即可获取原语,而只需分配值即可。 但是在幕后它仍然调用intValue方法。

那就是NPE发生的地方。 有问题的行变为:

return value.intValue();

在那条线上,很明显NPE发生在哪里。

哦,万一有人错过它,那么体育拳击运动就叫做Sweet Science。 我觉得自己被Autoboxing吸引住了,因此是本文的名称。

翻译自: https://www.javacodegeeks.com/2014/10/java-and-the-sweet-science.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值