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

Compile error for method reference in multiple exception handling

我遇到了一个有趣的情况。我有 2 个例外 classes MyException1MyException2。在多个 catch(MyException1 | MyException2 ex) 期间,SonarLint 建议使用方法引用 (ex::getExitCode) 而不是 lambda 表达式 (()=>ex.getExitCode())。但是,如果这次我听从建议,编译器会抱怨说“无法解析方法 'getExitCode'”。如果我删除其中一个异常编译成功。因此,代码仅在捕获一个异常时编译,否则我必须将 class 转换为两者的祖先。如果我施放它,这次 SonarLint 会警告我不必要的施放。有人可以解释这里发生了什么吗?

MyException1

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

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

MyException2

public class MyException2 extends RuntimeException implements ExitCodeGenerator {
    public MyException2 (String message, Throwable throwable) {
        super(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);
} 
...

已编译

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

multicatch的问题是ex的类型

它将是 Exception 而不是 ExitCodeGenerator 这就是为什么你必须抛出异常。