【问题标题】:BufferedReader Null DeferenceBufferedReader Null 引用
【发布时间】:2014-04-22 11:35:17
【问题描述】:

当我在下面的代码上进行 XSS 验证时,我在 while((anInt=bufferedReader.read())!=-1) 行遇到 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 条件..

【问题讨论】:

  • 这个问题对我来说没有多大意义。您是在谈论 NullPointerException 吗?如果是这样,请将堆栈跟踪添加到问题中。
  • BufferedReader.readLine() 在读取完毕后返回 null
  • @AsierAranbarri 因为他没有打电话给readLine(),,所以您的评论的相关性为零。
  • @EJP 它的相关性不为零。现在我知道我的错误了,所以在这里发表评论对我很有用。 ; )
  • @AsierAranbarri 它与所提出的问题的相关性为零,这就是 cmets 应该是什么。很高兴你从我这里学到了一些东西,你可以通过更仔细地阅读这个问题来学到一些东西,但它又与实际问题无关。

标签: java xss stringbuffer notnull


【解决方案1】:

我收到Null Dereference 问题

不,你不是。没有这样的“问题”。你得到的是NullPointerException. 请准确。解释错误消息,或者没有正确阅读它们,或者是什么导致了你的这个错误,这没有任何好处。

这里的ostensible 错误是使用bufferedReader.equals() 作为测试以查看bufferedReader 是否为null. 片刻的想法应该让您相信这样做是徒劳的。如果它为空,那么调用equals() 怎么会成功?

您这里的原始错误是结构不良的异常处理。 catch 块之后的代码依赖于 try 块的成功。因此它应该在 inside try 块中。然后你会注意到你只需要一个catch 块......但是请在里面放一些东西,比如exc.printStackTrace(): 否则调试就变成了一场猜谜游戏。

【讨论】:

    【解决方案2】:

    除了 EJP 指出的糟糕的异常处理(以及你令人震惊的释义......)之外,你的代码总是返回 null。这似乎毫无意义。


    但真正的问题实际上是 由您糟糕的异常处理引起的

    首先是这个:

    BufferedReader bufferedReader = null;
    try {
        bufferedReader = new BufferedReader(
                new FileReader(new File (url.toURI())));
    } catch (Exception e) {
        e.printStackTrace();
    }
    

    如果文件打开失败,您将捕获异常并继续。那是你的第一个错误。你不应该在那里捕获异常,因为你还没有准备好在那里处理它。

    接下来:

    if (!bufferedReader.equals(null)) {
    

    我希望这是应该防止bufferedReader 成为null。但实际上,如果bufferedReadernull,那么将导致抛出一个NPE ...因为您将尝试在空目标上调用方法(equals)目的。

    如果你想测试bufferedReader 是否是null,你应该这样编码:

    if (bufferedReader != null) {
    

    但如果您当时没有尝试处理之前的异常,则根本不需要 测试 null ...


    好的。我正在删除那个 .equals 条件

    叹息。停止破解代码并尝试理解答案

    在不解决第一个问题的情况下删除测试只是移动将抛出 NPE 的地方。

    【讨论】:

    • 好吧..我会按照你说的写空检查。
    • @Mdhar9e - 您仍然没有正确阅读答案。如果您解决了第一个问题并且您根本不需要测试 null。
    【解决方案3】:

    bufferedReader.equals(null) 应该抛出一个NullPointerException 来检查bufferedReader 是否为空,您可以执行bufferedReader != null

    【讨论】:

    • 仅当bufferedReader 为空时。
    • 当然,如果 bufferedReader 不为 null 则不应抛出 NullPointerException。
    • 为了清楚起见,如果 bufferedReader 为空,bufferedReader.equals() 将抛出 NullPointerException. 如果它不为空,则不会,如果你已经已经针对!= null. 进行了测试
    【解决方案4】:

    bufferedReader 可能抛出 EoFException 你必须处理它!

    【讨论】:

    • 没有BufferedReader 的方法抛出EOFException. 所有read() 重载在EOS 处返回-1,readLine() 返回null. -1
    猜你喜欢
    • 2016-01-08
    • 2015-03-07
    • 1970-01-01
    • 2016-01-03
    • 2016-07-09
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多