java BufferedReader空差异
在这里的第while((anInt=bufferedReader.read())!=-1)
行,当我对下面的代码进行XSS验证时,我得到了Null Dereference
问题。这是否足以检查not null,或者我们是否有其他检查或解决方案来解决此问题
BufferedReader bufferedReader = null;
try {
bufferedReader = new BufferedReader(new FileReader(new File (url.toURI())));
} catch (Exception e) {
e.printStackTrace();
}
response.setContentType("text/plain");
try{
int anInt=0;
//if(!bufferedReader.equals(null)){
while((anInt=bufferedReader.read())!=-1)
response.getWriter().write(anInt);
//}
} catch(IOException ioe) { }
return null;
注释了if条件
# 1 楼答案
bufferedReader.equals(null)
应该抛出一个NullPointerException
来检查bufferedReader
是否为空,您可以执行bufferedReader != null
# 2 楼答案
bufferedReader可能会抛出EOFEException,您必须处理它
# 3 楼答案
不,你不是。不存在这样的“问题”。你得到的是一个
NullPointerException.
请准确。解释错误信息,或者不正确地阅读错误信息,或者导致您出现此错误的原因是什么,都没有任何好处这里表面上的错误是使用
bufferedReader.equals()
作为测试,看看bufferedReader
是否是null.
一瞬间的想法应该让你相信这样做是徒劳的。如果它为null,那么对它调用equals()
将如何成功这里您的原始错误是结构不良的异常处理。在
catch
块之后有依赖于try
块成功的代码。因此,它应该位于try
块的内部。然后您将注意到,您只需要一个catch
块。。。但是请在它里面放一些东西,比如exc.printStackTrace():
,否则调试就变成了一个纯粹的猜测游戏# 4 楼答案
除了EJP指出的糟糕的异常处理(以及您惊人的解释…),您的代码总是返回
null
。这似乎有点毫无意义但是真正的问题实际上是由错误的异常处理引起的
首先:
如果文件打开失败,您将捕获异常并继续。这是你的第一个错误。您不应该在那里捕获异常,因为您还没有准备好在那里处理它
下一步:
我希望这是应该来防止
bufferedReader
被null
。但是在现实中,如果bufferedReader
是null
,那么会导致抛出一个NPE。。。因为您将尝试对空目标对象调用方法(equals
)如果要测试
bufferedReader
是否为null
,应按如下方式编写代码:但是,如果您当时没有尝试处理前面的异常,您根本不需要测试
null
唉。停止破解代码,尝试理解答案
在不解决第一个问题的情况下删除测试只是移动NPE将被抛出的位置