发布于2020-11-14 09:12 阅读(1150) 评论(0) 点赞(27) 收藏(1)
我object != null
要避免很多NullPointerException
。
有没有好的替代方法?
例如,我经常使用:
if (someobject != null) {
someobject.doCalc();
}
这将检查上述代码段中NullPointerException
的someobject
对象。
在我看来,这似乎是一个相当普遍的问题,初级和中级开发人员往往会在某个时候遇到这些问题:他们要么不知道,要么不信任他们所参与的合同,并且防御性地检查了null。另外,在编写自己的代码时,他们倾向于依靠返回空值来表示某些内容,因此要求调用者检查空值。
换句话说,在两种情况下会出现空检查:
如果为null,则表示合同中的有效回复;和
如果不是有效的回应。
(2)容易。使用assert
语句(断言)或允许失败(例如 NullPointerException)。断言是1.4中新增的一个未被充分利用的Java功能。语法为:
assert <condition>
要么
assert <condition> : <object>
where<condition>
是一个布尔表达式,<object>
是一个对象,其toString()
方法的输出将包含在错误中。
一个assert
语句抛出一个Error
(AssertionError
如果条件是不正确的)。默认情况下,Java会忽略断言。您可以通过将选项传递-ea
给JVM来启用断言。您可以启用和禁用单个类和程序包的断言。这意味着您可以在开发和测试时使用断言来验证代码,并在生产环境中禁用它们,尽管我的测试几乎没有显示断言对性能的影响。
在这种情况下,不使用断言是可以的,因为代码只会失败,这就是使用断言时会发生的情况。唯一的区别是,有了断言,它可能会更早地发生,以更有意义的方式出现,并可能带有额外的信息,这可以帮助您弄清楚为什么它出乎意料。
(1)有点难。如果您无法控制正在调用的代码,那么您将陷入困境。如果null为有效响应,则必须检查它。
但是,如果是您控制的代码(通常是这种情况),那就是另一回事了。避免使用null作为响应。使用返回集合的方法很容易:几乎总是返回空集合(或数组)而不是null。
使用非收集,可能会更困难。以这个为例:如果您具有以下接口:
public interface Action {
void doSomething();
}
public interface Parser {
Action findAction(String userInput);
}
在Parser中,原始的用户输入会找到要执行的操作,也许是在您实现某项功能的命令行界面时。现在,如果没有适当的操作,您可以使合同返回null。这导致您正在谈论的空检查。
另一种解决方案是从不返回null,而使用Null Object模式:
public class MyParser implements Parser {
private static Action DO_NOTHING = new Action() {
public void doSomething() { /* do nothing */ }
};
public Action findAction(String userInput) {
// ...
if ( /* we can't find any actions */ ) {
return DO_NOTHING;
}
}
}
相比:
Parser parser = ParserFactory.getParser();
if (parser == null) {
// now what?
// this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {
// do nothing
} else {
action.doSomething();
}
至
ParserFactory.getParser().findAction(someInput).doSomething();
这是一个更好的设计,因为它可以导致代码更简洁。
也就是说,对于findAction()方法来说,抛出带有有意义的错误消息的Exception异常是完全适当的-特别是在这种情况下,您依赖于用户输入。对于findAction方法抛出一个异常,比对一个没有解释的简单NullPointerException进行抛出的调用方法要好得多。
try {
ParserFactory.getParser().findAction(someInput).doSomething();
} catch(ActionNotFoundException anfe) {
userConsole.err(anfe.getMessage());
}
或者,如果您认为try / catch机制太丑陋,而不是什么都不做,则您的默认操作应向用户提供反馈。
public Action findAction(final String userInput) {
/* Code to return requested Action if found */
return new Action() {
public void doSomething() {
userConsole.err("Action not found: " + userInput);
}
}
}
作者:黑洞官方问答小能手
链接:http://www.javaheidong.com/blog/article/500/4640063219743f876ca6/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!