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

Java8-有效的final变量、lambdas和try/catch/finally块

苏彦君
2023-03-14

因此,我开始使用Java8streams/lambda表达式,遇到了一些有趣的问题,我不知道如何解决这些问题。所以我在这里,请求你的帮助。

public void insertBlankPages(File inputFile, String outputFile, final int OFFSET) {
    PDDocument newDocument;
    PDDocument oldDocument;
    try {
        newDocument = createNewDocument();
        oldDocument = createOldDocument(inputFile);
        List<PDPage> oldPages = getAllPages(oldDocument);

        oldPages.stream()
                .limit(oldPages.size() - OFFSET)
                .forEach(page -> {
                    newDocument.addPage(page);
                    newDocument.addPage(new PDPage(page.getMediaBox()));
                });

        newDocument.save(outputFile);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (COSVisitorException e) {
        e.printStackTrace();
    } finally {
        newDocument.close();
        oldDocument.close();
    }
}
PDDocument newDocument = null;
PDDocument oldDocument = null;

现在我得到编译器错误“在lambda表达式中使用的变量应该有效地是final”。

怎么做?

方法createNewDocument和createOldDocument引发异常,因此调用必须在try/catch块内。我还需要关闭finally块内的文档。

共有1个答案

舒仲渊
2023-03-14

适当的解决办法是用资源尝试。

否则,您需要手动嵌套更多的try/finally块:

try {
    PDDocument newDocument = createNewDocument();
    try{           
       PDDocument oldDocument = createOldDocument(inputFile);
       try{
          // .....
       }
       finally { oldDocument.close() }
    }
    finally{ newDocument.close(); }
}
catch (IOException e) {
    e.printStackTrace();
} 
 类似资料:
  • 以下代码不能用javac 1.8.0_144和ECJ编译: > 未声明为最终。 在赋值表达式(§15.26)中,它从不作为左手边出现。(请注意,包含 初始值设定项的局部变量声明符不是赋值表达式。) 它从不作为前缀或后缀递增或递减运算符的操作数出现(§15.14,§15.15)。 它从不作为前缀或后缀递增或递减运算符的操作数出现。 方法、构造函数、λ或异常参数(§8.4.1,§8.8.1,§9.4,

  • 问题内容: 我正在审查一些新代码。该程序仅具有try和finally块。由于不包含catch块,如果try块遇到异常或任何可抛出的异常,它将如何工作?它是否直接进入了finally块? 问题答案: 如果try块中的任何代码都可以引发已检查的异常,则它必须出现在方法签名的throws子句中。如果引发了未经检查的异常,则该异常会冒泡退出方法。 无论是否引发异常,都始终执行finally块。

  • 在实际开发中,根据 try catch 语句的执行过程,try 语句块和 catch 语句块有可能不被完全执行,而有些处理代码则要求必须执行。例如,程序在 try 块里打开了一些物理资源(如数据库连接、网络连接和磁盘文件等),这些物理资源都必须显式回收。 Java的垃圾回收机制不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。 所以为了确保一定能回收 try 块中打开的物理资源,异

  • 本文向大家介绍说明PowerShell中的Try / Catch / Finally块,包括了说明PowerShell中的Try / Catch / Finally块的使用技巧和注意事项,需要的朋友参考一下 PowerShell中的Try / Catch块用于处理脚本中产生的错误。具体而言,错误应该是终止错误。在最后在PowerShell中块不是强制性的,每次沿写try / catch语句,但它会

  • 是否有像java try catch finally这样的linux bash命令?还是linux shell总是在运行?

  • 因为我相信这是一个很好的编程实践,所以如果我的所有(局部或实例)变量只需要编写一次,我就将它们设为< code>final。 但是,我注意到当变量赋值可以抛出异常时,您不能将所述变量设为最终变量: 有没有办法在不诉诸临时变量的情况下做到这一点?(或者这不是最终修饰符的正确位置?)