多异常处理中方法引用的编译错误

问题描述

我遇到了一个有趣的情况。我有 2 个异常类 ;WITH CTE AS ( SELECT t2.[Date],t2.[Value],SUM(CASE WHEN t1.[Date] IS NOT NULL Then 1 END) OVER(ORDER BY t2.[Date] DESC) grp FROM #table2 t2 LEFT JOIN #table1 t1 ON t1.[Date] = t2.[Date] ) SELECT MAX([Date]) as 'Date',SUM([Value]) as 'Value' FROM CTE GROUP BY grp ORDER BY [Date] MyException1。在多个 catch(MyException2) 期间,SonarLint 建议使用方法引用 MyException1 | MyException2 ex 而不是 lambda 表达式 ((ex::getExitCode))。但是如果我这次按照建议,编译器会抱怨说“无法解析方法'getExitCode'”。如果我删除异常之一编译成功。所以代码只编译一个异常捕获,或者我必须将类转换为两者的祖先。如果我施放它,这次 SonarLint 会警告我有关不必要的施放。有人可以解释一下这里发生了什么吗?

MyException1

()=>ex.getExitCode()

MyException2

public class MyException1 extends RuntimeException implements ExitCodeGenerator {
    public MyException1 (String message,Throwable throwable) {
        super(message,throwable);
    }

    @Override
    public int getExitCode() {
        return -2;
    }
}

编译错误

public class MyException2 extends RuntimeException implements ExitCodeGenerator {
    public MyException2 (String message,throwable);
    }

    @Override
    public int getExitCode() {
        return -2;
    }
}

编译

...
} catch (MyException1 | MyException2 ex) {
    System.exit(SpringApplication.exit(event.getApplicationContext(),ex::getExitCode);
} 
...

编译

...
} catch (MyException1 | MyException2 ex) {
    System.exit(SpringApplication.exit(event.getApplicationContext(),((ExitCodeGenerator)ex)::getExitCode);
} 
...

解决方法

multicatch 的问题是 ex 的类型。

它将是 Exception 而不是 ExitCodeGenerator,这就是您必须抛出异常的原因。