有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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条件


共 (4) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

    bufferedReader可能会抛出EOFEException,您必须处理它

  3. # 3 楼答案

    I am getting Null Dereference issue

    不,你不是。不存在这样的“问题”。你得到的是一个NullPointerException.请准确。解释错误信息,或者不正确地阅读错误信息,或者导致您出现此错误的原因是什么,都没有任何好处

    这里表面上的错误是使用bufferedReader.equals()作为测试,看看bufferedReader是否是null.一瞬间的想法应该让你相信这样做是徒劳的。如果它为null,那么对它调用equals()将如何成功

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

  4. # 4 楼答案

    除了EJP指出的糟糕的异常处理(以及您惊人的解释…),您的代码总是返回null。这似乎有点毫无意义


    但是真正的问题实际上是由错误的异常处理引起的

    首先:

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

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

    下一步:

    if (!bufferedReader.equals(null)) {
    

    我希望这是应该来防止bufferedReadernull。但是在现实中,如果bufferedReadernull,那么会导致抛出一个NPE。。。因为您将尝试对空目标对象调用方法(equals

    如果要测试bufferedReader是否为null,应按如下方式编写代码:

    if (bufferedReader != null) {
    

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


    ok. i am removing that .equals condition

    唉。停止破解代码,尝试理解答案

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