【问题标题】:No NullPointerException on the logs日志上没有 NullPointerException
【发布时间】:2020-11-27 20:45:27
【问题描述】:

我的 java 代码中有一个奇怪的行为,我想请教一些建议。 在一个多线程应用程序中,我编写了以下代码:

scratchDir.resolve(directoryTree).toFile().mkdirs();

对于对象scratchDir 为空的错误,我期待日志上有堆栈跟踪,但没有任何关于错误的信息。 我检查了代码,但我从未尝试捕获 NullPointerException。

这里是完整的方法代码:

    @Override
    public void write(JsonObject jsonObject) throws FileSystemException {
        Path directoryTree = getRelativePath();
        scratchDir.resolve(directoryTree).toFile().mkdirs();
        String newFileName = getHashFileName(jsonObject);
        Path filePath = scratchDir.resolve(directoryTree).resolve(newFileName);
        logger.debug("Write new file Json {} to persistent storage dir {}", newFileName, scratchDir);
        File outputFile = filePath.toFile();
        if (outputFile.exists()) {
            throw new FileAlreadyExistsException(filePath.toString());
        }
        try (FileWriter fileWriter = new FileWriter(outputFile)) {
            fileWriter.write(jsonObject.toString());
            fileWriter.flush();
        } catch (Exception e) {
            logger.error(e);
        }
    }

为什么我的日志中没有异常?

【问题讨论】:

  • 如果它不在您的日志中,那么您可能没有记录它。 NullPointerException 会被这个方法抛出,所以接下来会发生什么取决于这个方法的调用者对异常做了什么。如果没有minimal reproducible example,我们真的无法为您提供帮助。
  • 你自己说:“我已经检查了代码,但我从未尝试捕获 NullPointerException。”如果您希望记录和/或处理空指针,您应该尝试/抓住第 4 行引发异常的地方
  • 好吧,这可能是Java中真正被误解的东西。 NullPointer 异常在到达邮件之前不会弹出,然后以任何方式发送到标准错误?

标签: java exception logging nullpointerexception


【解决方案1】:

你为什么要这样做?

正确的做法是:

Files.createDirectories(scratchDir.resolve(directoryTree));

不要混用新旧 API。您检查返回值的旧 mkdirs() api DEMANDS;如果它为假,则操作失败,并且您不会从异常中得到好处来告诉您原因。 这就是为什么首先出现新 API 的主要原因

您确定您没有感到困惑吗?那才是真正的问题?正如你所拥有的那样,这条线将很高兴绝对不会做任何事情(没有目录,也没有日志或异常)。如果无法创建目录,上面的行会抛出,所以从那里开始。

然后,如果该行正在运行并且没有记录任何内容,那么您已经捕获了 NPE 并将其丢弃在您没有粘贴的某个地方。

【讨论】:

  • 感谢您的建议,刚才我想我混合了 IO 和 NIO api。我将更改我的代码并尝试了解我丢弃异常的位置。
猜你喜欢
  • 2019-12-20
  • 1970-01-01
  • 2019-01-29
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 2017-01-11
  • 2021-05-11
  • 1970-01-01
相关资源
最近更新 更多