2012-05-07 2 views
0
public void writeToParcel(Parcel parcel, int flags) throws IOException { 
    doSomethingThatThrowsIOException(); 
} 

Quoth компилятором:Почему я не могу исключить IOException из моего Parcelable.writeToParcel (Parcel, int)?

Исключение IOException не совместим с бросками пункт в Parcelable.writeToParcel (Parcel, Int)

Я не вижу бросками положение где-нибудь в документы или фактический код Parcelable. Это жуткий вопрос?

+0

Я не могу принять ответ всеобщее, я дам кредит нуб. Спасибо всем за вклад! – QED

+0

Большое спасибо psoft! :-) –

ответ

2

Метод writeToParcel переопределяется из родительского класса: Посылка. Когда вы переопределяете метод, вы не можете изменить ни подпись, ни предложение throws исходного метода.

два варианта: экстернализовать материал, который бросает IOException ИЛИ Handle исключения внутри попытку - поймать блок ...

3

Parcelable.writeToParcel(Parcel, int) в Parcelable не бросает исключение IOException. Поэтому, если вы расширяете класс и определяете свой собственный writeToParcel(Parcel, int), он не может выставить проверенное исключение, которое не находится в родительском классе.

1

Это точная проблема, исключение IOException является проверенным исключением и должно быть восстановлено или поймано. Если super не выбрасывает это исключение, вы не можете этого сделать.

От JLS §11.2:

Проверяемых классы исключений, названных в бросках пункта является частью договора между разработчиком и пользователем метода или конструктора. Предложение throws метода переопределения может не указывать , что этот метод приведет к выбросу любого проверенного исключения, которое переопределенному методу не разрешено в соответствии с его предложением бросков до . Когда задействованы интерфейсы, более чем одно объявление метода может быть переопределено одним объявлением переопределения. В этом случае объявление переопределения должно иметь предложение throws, которое равно , совместимое со всеми переопределенными объявлениями (§9.4).