0
public void writeToParcel(Parcel parcel, int flags) throws IOException {
   doSomethingThatThrowsIOException();
}

コンパイラをクォートします。

例外IOExceptionは、Parcelable.writeToParcel(Parcel、int)のthrows句と互換性がありません

Parcelableドキュメントや実際のコードのどこにもthrows句がありません。これは厄介なスレッドの問題ですか?

4

3 に答える 3

3

Parcelable.writeToParcel(Parcel, int)inParcelableはIOExceptionをスローしません。したがって、クラスを拡張して独自のを定義した場合writeToParcel(Parcel, int)、親クラスにないチェック済み例外をスローすることはできません。

于 2012-05-07T16:55:17.540 に答える
2

「writeToParcel」メソッドは、親クラスであるParcelからオーバーライドされます。メソッドをオーバーライドする場合、元のメソッドの署名やthrows句を変更することはできません。

2つのオプションは次のとおりです。IOExceptionをスローするものを外部化するか、try--catchブロック内で例外を処理します。

于 2012-05-07T16:55:51.120 に答える
1

これが正確な問題です。IOExceptionはチェックされた例外であり、再スローまたはキャッチする必要があります。superこの例外をスローしない場合は、同様にスローすることはできません。

JLS§11.2から:

throws句で指定されたチェック済みの例外クラスは、メソッドまたはコンストラクターの実装者とユーザーの間のコントラクトの一部です。オーバーライドするメソッドのthrows節は、このメソッドが、そのthrows節によって、オーバーライドされたメソッドがスローすることを許可されていないチェック済み例外をスローすることになることを指定しない場合があります。インターフェイスが関係している場合、複数のメソッド宣言が単一のオーバーライド宣言によってオーバーライドされる場合があります。この場合、オーバーライドする宣言には、すべてのオーバーライドされる宣言と互換性のあるthrows句が必要です(§9.4)。

于 2012-05-07T16:55:44.217 に答える