object != null
要避免很多NullPointerException
。
有没有好的替代方法?
例如:
if (someobject != null) {
someobject.doCalc();
}
NullPointerException
当不知道对象是否存在时,可以避免使用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);
}
}
}
问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)
问题内容: 当我尝试使用在页面对象中具有空格的类名称时,我得到: 我该如何使用具有空格的类名。 例如: 问题答案: 改用CSS选择器: 需要注意的重要一点是该示例是错误的!If 的意思是一个国家的名称。类名中不能包含空格。实际上,该属性是用空格分隔的类列表。这意味着,如果您有一个类,则不是一个类,而是您的元素所属的 两个 不同的类-第一个是,第二个是! 因此,如果错误,请修复您的课程。如果不是,则
问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免
问题内容: 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 以下是我得到的 我已经添加了与此对应的所有jar文件,但仍然找不到解决方案。我对apache poi是陌生的,所以请帮我提供一些解释和示例。谢谢 问题答案: 从我对问题的评论中复制: 看起来您需要Apache POI发行版中的poi-ooxml-sc
本文向大家介绍Java Web 如何避免 SQL 注入?相关面试题,主要包含被问及Java Web 如何避免 SQL 注入?时的应答技巧和注意事项,需要的朋友参考一下 使用预处理 PreparedStatement。 使用正则表达式过滤掉字符中的特殊字符。
当方法调用的嵌套层级过深,导致栈空间耗尽时,会抛出StackOverflowError错误。 尝试复现问题,代码如下: