什么是exception不与throws子句兼容的原因?

任何人都可以告诉我exception可能有什么原因,而不是与“throws”条款兼容

例如:

class Sub extends Super{ @Override void foo() throws Exception{ } } class Super{ void foo() throws IOException{ } } 

exceptionexception与Super.foo()中的throws子句不兼容

如果没有完整的代码示例,我只能猜测:您在子类中重写/实现了一个方法,但是子类方法的exception规范与超类/接口方法的exception规范不兼容(即不是其子集)?

如果声明base方法根本不抛出任何exception,或者例如java.io.IOException (这是你的方法试图抛出的java.lang.Exception的子类),就会发生这种情况。 基类/接口的客户端期望其实例遵守base方法声明的契约,因此从该方法的实现中抛出Exception会破坏契约(和LSP )。

已检查的exception旨在用于方法可能期望其调用者准备好处理可能出现的某些问题的情况。 如果BaseFoo.Bar()调用者不需要处理FnordException ,那么方法DerivedFoo.Bar()也不能指望它的调用者处理FnordException (因为它的许多调用者将是那些没有准备FnordException调用者) BaseFoo.Bar()抛出它)。

从概念上讲,这很棒。 在实践中,没有那么多。 问题是,语言中经过检查的exception的设计假定没有呼叫者准备好优雅地处理特定问题,或者所有呼叫者都准备好处理它。 在实践中,正常的事态是呼叫者没有准备好处理exception – 即使是某些呼叫者可能能够处理的exception。 大多数情况下,当代码收到一个未明确期望的已检查exception时,正确的操作过程是将其包装在未经检查的exception中并抛出它。 具有讽刺意味的是,最简单的行动方案 – 添加“投掷”条款并让检查的exception泡沫升级,可能是最不可能正确的。 虽然有一些情况(例如IOException ),这种行为是有意义的(例如,当尝试从文件中读取集合时,读取一个项目时的I / O错误是读取集合时的I / O错误),从嵌套方法调用中抛出的exception将表示与外部方法抛出的相同类型的exception不同的条件,并且准备处理后者的代码可能不准备处理前者。

在您的情况下,您最好的选择可能是捕获IOException并将其包装在从RuntimeException派生的其他类型中,意识到您的调用者不太可能能够处理它。

要修复它,请使用RuntimeException

 public T findById(long id) throws RuntimeException { try { return whatEver.create(); } catch (SystemException e) { throw new RuntimeException(e); } } 

希望这可以帮助。

确保你声明抛出你的界面。 如果你这样做了,但问题仍然存在 – 尝试保存/重建项目。