5

Java で、かなり一般的な既存のインターフェースを使用しているとします。

public interface Generator {
    public String generate();
}

そして私は自分のクラスを持っています

public class FromFileGenerator implements Generator {
    ...
    public String generate() throws FileNotFoundException {
        String output = //read from some file
        return file;
    }
}

generate() の実装には、元の署名で指定されていない例外 (FileNotFoundException) が含まれているため、Java コンパイラは私に怒鳴りつけます。ただし、明らかに例外はインターフェイスに属していませんが、実装クラスでも無視できません。単に黙って失敗することなく、これをどのように解決できますか?

4

5 に答える 5

14

別のメソッドを非表示、オーバーライド、または実装するメソッドの宣言に、チェック済み例外を追加することはできません。メソッド内で例外をキャッチし、それを使用して別のことを行う必要があります ( return null、チェックされていない例外をスローするなど、チェックされた例外をラップする可能性があります)。

Java 言語仕様、§8.4.8.3から:

インターフェイスで定義された抽象メソッドを実装するメソッドを含む、別のメソッドをオーバーライドまたは非表示にするメソッドは、オーバーライドまたは非表示のメソッドよりも多くのチェック例外をスローするように宣言することはできません。

于 2012-08-06T20:43:48.147 に答える
5

インターフェイスはコントラクトです。

ここに画像の説明を入力

したがって、事前に定義する必要があります。

したがって、try を実行するか、メソッド本体内でキャッチするか、コントラクトを変更することができます。

于 2012-08-06T20:45:37.723 に答える
4

残念ながら、これをうまく解決する方法はありません。例外仕様はインターフェースの一部であるため、あなたのGeneratorインターフェースにプログラミングする人が を期待していFileNotFoundExceptionないのであれば、彼らが を使用するときにそれが来るはずはありませんFromFileGenerator

これを解決する一般的な方法は、一般的な例外を導入し、それをラップFileNotFoundExceptionすることです。

public class GeneratorException extends Exception {
    public GeneratorException(Exception inner) {
        super(inner);
    }
}
public interface Generator {
    public String generate() throws GeneratorException;
}
public class FromFileGenerator implements Generator {
...
    public String generate() throws GeneratorException {
        try {
            String output = //read from some file
            return file;
        } catch (FileNotFoundException fnf) {
            throw new GeneratorException(fnf);
        }
    }
}
于 2012-08-06T20:44:35.193 に答える
3

これに対する一般的な解決策は、チェックされていない例外で例外をラップすることです。したがって、クラスは次のようになります。

public class FromFileGenerator implements Generator {
    ...
    public String generate() throws FileNotFoundException {
        try {
            String output = //read from some file
            return output
        } catch (FileNotFoundException e) {
            throw new IllegalStateException(e);
        }
    }
}

さらに良いのは、独自のチェック例外を持つようにインターフェイスを変更することです。次に、上記のチェックされていないIllegalStateExceptionに変換するのと同じ方法で、FileNotFoundExceptionからそのチェックされた例外に変換できます。

于 2012-08-06T20:48:33.747 に答える
3

未チェックの例外で実装例外をラップし、それをスローできます。

public class FromFileGenerator implements Generator {
    ...
    public String generate() {
        try {
            String output = //read from some file
            return file;
        } catch (IOException ioe) {
            throw new RuntimeException(ioe);
        }
    }
}
于 2012-08-06T20:45:37.140 に答える