IllegalArg与null检查

时间:2013-09-26 00:14:48

标签: java

如果我有类似

的课程
class A
{
   Private B b;

   X getX()
   {
      X x = b.newClient().call(); 
   }

}

我应该检查b是否为空?应如何处理?使用异常(例如,这不是一个真正的参数,所以抛出非法声明在这里有意义吗?或者只是记录错误?

3 个答案:

答案 0 :(得分:1)

private B b是隐藏的内部实现的一部分(即,它不是公共API的一部分,由您的类的客户端使用)。因此,作为该类的开发人员,b为空,这不是客户端的问题,而是您的问题。


想象一下,如果你试图使用GitHub上的一些闪亮的新库:

MagicAnythingParser parser = new MagicAnythingParser();
parser.parse(myDocument);

并且对parse的调用引发了一个说"intakeManifold is null"的异常。你会想“这到底是什么?!”

你几乎不知道,你期待首先拨打电话:

parser.setupParseRules(someRuleset);

在内部,这创建了一些对象并将其分配给intakeManifold

如果MagicAnythingParser能够很好地跟踪其内部状态,那么更好的方案就是IllegelStateException("No parse rules applied. You must call setupParseRules first.")


我的全部观点是,您应该开发类的公共API,并考虑客户端(即使客户端就是您。)尽量确保您的对象始终处于“良好状态” - 并且当您不能,抛出有意义的例外,使其明显问题是什么。

答案 1 :(得分:0)

你有处理空指针可能性的策略吗?即如果变量永远不应为null,因此表明存在错误,那么您可能不想隐藏它。我是一个让系统在我脸上爆炸的粉丝,这样可以很快找到错误并轻松确定根本原因。

如果您的代码设计为无论如何都要继续,例如在处理批次时并且您不希望批处理项中的一个错误杀死整个批次,那么您可以记录它或其他任何内容。但除此之外,让NPE做到这一点。

答案 2 :(得分:0)

检查 getX 中的 b 是否为空并不会给您带来太多帮助。您正在为另一个运行一个运行时异常。你真的想知道为什么 b 是空的。

我建议让 b 最终并通过构造函数进行设置。在构造函数中执行null检查。