【问题标题】:unhandled exception type filenotfoundexception, compilation problem未处理的异常类型filenotfoundexception,编译问题
【发布时间】:2020-01-16 13:55:22
【问题描述】:

我正在尝试从磁盘读取文件,但是我遇到了编译错误 上

 catch (Docx4JException | IOException e) {
                e.printStackTrace();
                log.error("Błąd Docx4J: ", e);
                throw e;
            }

未处理的异常类型文件notfoundexception有什么想法吗?

Stream<Path> files = Files.list(Paths.get(genConfig.getDocxJiraReportDirectory()));

        files.forEach(file -> {

            final WordprocessingMLPackage wordMLPackage;

            try {
                wordMLPackage = fileGenerator.loadFile(genConfig.getDocxTemplateDirectory(),
                        params.getTemplateFileName());

                    FileInputStream fis = new FileInputStream(file.toString());
                    String data = IOUtils.toString(fis, "UTF-8");

                    System.out.println(data);

                    String dataFinal = XmlHelper.GenerateEanImage(data);

                    Docx4J.bind(wordMLPackage, dataFinal, Docx4J.FLAG_NONE);

                    String filePath = genConfig.getDocxReportDirectory() + "/" + file.getFileName();
                    Docx4J.save(wordMLPackage, new File(filePath), Docx4J.FLAG_NONE);
            } catch (Docx4JException | IOException e) {
                e.printStackTrace();
                log.error("Błąd Docx4J: ", e);
                throw e;
            }

        });

【问题讨论】:

  • 正在详细说明问题。您有一个未处理(未捕获)的 FileNotFoundException。将 FileNotFoundException 添加到您的 catch 块中。
  • 但是 FileNotFoundException 是 IOException 的子类
  • 可能是因为您获取文件流的第一行不在您的 try/catch 中
  • 其他错误很简单,你的 catch en rethrox 异常不是运行时异常:“throw e;”应替换为“throw new RuntimeException(e);”这将解决您的编译问题:消费者(由 foreach 使用)不能抛出非运行时异常

标签: java file-io java-io fileinputstream


【解决方案1】:

如果您真的想重新抛出异常,请将其包装在 RuntimeException 中。

    } catch (Docx4JException | IOException e) {
        e.printStackTrace();
        log.error("Błąd Docx4J: {}", e);
        throw new RuntimeException(e);
    }

顺便说一句,您在log.error 中缺少{}

【讨论】:

  • UncheckedIOException 在这种情况下会更好,但它需要更复杂的throw 子句。
  • @M.Prokhorov 不适用于Docx4JException
  • @Holger,是的,但我假设 Docx4JException 未选中,因此您可以使用 throw (e instanceof Docx4JException) ? (RuntimeException) e : new UncheckedIOException(e);。这正是我所说的“更复杂的throw 子句”的意思。
  • @M.Prokhorov 这似乎是一个受检异常,但无论如何,如果你想区别对待它们,对这两种异常类型使用两个catch 子句会更简单。跨度>
  • @Holger,是的,你是对的,它也被检查了,所以不是演员表,而是另一个包装。我有点不同意第二次尝试捕获,因为在追溯之前的所有事情都必须重复两次,而且它还不够干,不适合我的口味。虽然我会说这个小细节不太可能值得我们现在提供的脑力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2010-09-29
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2012-12-22
相关资源
最近更新 更多