2

涉及到对象操作 object.xxxx(),如果对象为null则会抛异常,如果每次都if(o !=null) 代码很丑陋

一种做法是创建对象或者方法返回对象时都new一个对象而不是返回null
不过这样有时也不太好,比如结果为空的时候返回null更合理一点

有更好的建议么 ?

ddcz 46
2012-08-28 提问

查看全部 14 个回答

0

在Java的工程实践中,需要经常判断对象是否为null是一个常见都困扰,根据个人经验,我通常不做任何的判断,任其抛出NullPointerException。因为方法或者构造函数中允许参数为null通常并不是一个好的工程设计。或许有人会以为了增加系统的容错性,所以允许null参数来反驳,这也有一定的道理,不过这还是取决于你的类设计。我的经验是,通常要将你所设计的类划分职责,越是倾向于底层逻辑、基础数据操作的类,可以适当的容忍null参数;越是倾向于重要业务逻辑的类,通常不容忍null参数。在处理NullPointerException或者其他RuntimeException的时候,应该有一个统一的错误处理策略。就像Spring中对于Exception的策略一样,所有的方法都抛出RuntimeException。

多说一句,这个话题其实涉及到如何设计你的系统中的错误处理机制。这个绝对是见仁见智的事情,不会有一个绝对正确的答案。

推荐答案

6

已采纳

这是是工程设计上常见的问题,一般的解决方案就是 @特价萝卜 所说的NullObject模式。本来想投 @特价萝卜 的答案赞成票,但纠结良久还是觉得说得有些复杂了。

简单来说就是有一个NullObject与原有业务对象实现相同的接口(或继承同一个父类),让客户端调用时可以无感知(也不必判定null)

有一个很好的例子就是著名JSON解析框架Jackson。以下代码是Jackson从一段JSON中获取其一级子节点lv1下的二级子节点lv2的内容:

JsonNode root = ...;
JsonNode child = root.get("lv1").get("lv2");

以上代码很可能遇到lv1不存在的情况,因此第一个get()就会返回null,那么第二个get()执行时自然就抛出NullPointerException了。为了解决这个问题,作者提供了path方法来替代get方法:

JsonNode root = ...;
JsonNode child = root.path("lv1").path("lv2");

当lv1不存在时,path()返回一个JsonNode的子类叫做MissingNode(但客户端暂时无需知道),MissingNode的path方法则继续返回MissingNode,这样无论这个链式调用写多长都不会抛出任何异常。

直到最后客户端调用完成后检查返回结果是否为MissingNode:

if (child.isMissingNode()) { ... }

推广链接