当前位置: 首页 > 知识库问答 >
问题:

Java list.stream.foreach Lambda表达式中未处理的IOException

堵昊焱
2023-03-14

我正在使用Java8中引入的Stream API,为列表中的每个字符串运行一个方法。

public boolean initFile() throws IOException
{
    if (this.outFile.exists()) {
        this.outFile.delete();
    }
    return this.outFile.createNewFile();
}

public void writeStringToFile(String str, boolean addNewLine) throws IOException
{
    if (this.mode != FileMode.READ) {
        if (this.initFile()) {
            FileWriter fileWriter;
            if (this.mode == FileMode.APPEND)
                fileWriter = new FileWriter(outFile.getAbsolutePath(), true);
            else
                fileWriter = new FileWriter(outFile.getAbsolutePath());
            fileWriter.write(str);
            if (addNewLine)
                fileWriter.write("\n");
            fileWriter.close();
        } else {
            throw new IOException("IO Error: The file could not be initialized.");
        }
    } else {
        throw new IOException("Cannot write to a file with the mode FileMode.READ");
    }
}

public void writeListToFile(List<String> strings, boolean addNewLine) throws IOException
{
    strings.stream().forEach(s -> this.writeStringToFile(s, addNewLine)); // Unhandled IOException from writeStringToFile
}

如您所见,方法签名状态为抛出所有IOExceptions,流中的writeToString方法可能抛出IOException。但是,Java编译器给了我一个错误,指出流线上有一个未处理的IOException。

为什么流中的异常不会像方法中的其他异常一样被抛出?有没有什么方法可以在不在forEach lambda表达式中添加try-catch语句的情况下解决这个问题?

共有1个答案

羊冠玉
2023-03-14

您必须在writeListToFile方法中使用try catch,如下所示:

  public void writeListToFile(List<String> strings, boolean addNewLine) throws Exception {
    strings.stream().forEach(s -> {
        try {
            writeStringToFile(s, addNewLine);
        } catch (IOException ex) {
            //you can Log it immediately or throw ex;
            Logger.getLogger(C.class.getName()).log(Level.SEVERE, null, ex);
        }
    });
    // Unhandled IOException from writeStringToFile
}

为什么?看看这一点s->{}。这里{}表示编译器创建新接口(使用者)

 void forEach(Consumer<? super T> action);

新类实现了这个接口,并将s参数传递给它的accept方法。你能在你的方法中抛出新类的异常吗?不,所以你必须试着抓住每一个foreach项目

 类似资料:
  • 对于精度数学,只要可能,就会使用给定的准确值数值。例如,在比较中所用的数值与给定的值准确相同,无任何变化。在严格的SQL模式下,对于插入具有准确数据类型(DECIMAL或整数)的列的INSERT操作,如果值在列的允许范围内,将插入具有准确值的数值。检索时,所获得的值与插入的值应是相同(如果未采用严格模式,允许INSERT执行截短操作)。 对数值表达式的处理取决于表达式包含的值的类型: ·如果存在任

  • 我正在尝试使用python中的正则表达式。我构建了正则表达式,如下所示。我知道用于匹配搜索字符串的开头。我已使用包含多个的匹配模式构建框架,但我不确定将如何尝试匹配搜索字符串中的模式。 我预计会引发错误,关于无效的正则表达式,但它不会引发任何错误,也不会返回任何匹配项。 所以,我的问题是或是有效的正则表达式吗?

  • 寻找一个java正则表达式函数,如果数组元素列表中的特殊字符出现在前面或后面,则返回true 2-返回False如果任何alpha字符之前和之后从我的数组元素列表我的数组元素wordsList={"TIN","tin"}输入: 1-CardTIN是1111 2-Card-TIN:2222 3-cardtinis3334-Card@TIN@4444 5-CardTIN@55556-TINis9999

  • 问题内容: 有没有办法让AngularJS在模型数据中评估表达式? HTML: 模型: 最终结果将是:。 问题答案: 您可以使用该服务来插值字符串… JSFiddle

  • 我有metohod myservice#create,它抛出CustomException。我在可选#map中调用此方法,如下所示: 当我用引起异常的参数调用这个方法时,就会捕获CustomException,但结果是操作成功,状态为200。如何在lambda中处理此异常并返回异常消息?

  • 我对lambda表达有意见。我的代码: 有可能吗?我只能使用java.util.function。我尝试从“lambda”中删除try catch,而我“main”方法应该正在捕获异常。