Это означает, что вызываемый вами метод объявлен с директивой throws
для исключения, полученного из класса Exception
.Когда метод объявляется таким образом, вы вынуждены обрабатывать исключение, используя блок try/catch
, или добавляете идентичный оператор throws
(для того же исключения или супертипа) в объявление метода.
Пример.
Я хочу вызвать некоторый метод foo
внутри моего метода bar
.
Вот определение foo
:
public static void foo(String a) throws Exception {
// foo does something interesting here.
}
Я хочу позвонить foo
.Если я просто сделаю это:
private void bar() {
foo("test");
}
... тогда я получу ошибку, с которой вы столкнулись.foo
объявляет миру, что действительно может решить бросить Exception
, и вам лучше быть готовым с этим справиться.
У меня есть два варианта.Я могу изменить определение bar
следующим образом:
private void bar() throws Exception {
foo("test");
}
Теперь я опубликовал свое собственное предупреждение о том, что мой метод или какой-то метод, который я вызываю, может выдать Exception
, что пользователь моего метода должениметь дело с.Поскольку я отложил ответственность до вызывающего метода, мой метод не должен иметь дело с самим исключением.
Часто лучше иметь дело с исключением самостоятельно, если можете.Это подводит нас ко второму варианту, try/catch
:
private void bar() {
try {
foo("test");
} catch(Exception e) {
Log.wtf("MyApp", "Something went wrong with foo!", e);
}
}
Теперь я имел дело с потенциалом Exception
, генерируемым foo
, на который жаловался компилятор.Поскольку это уже решено, мне не нужно добавлять директиву throws
в мой метод bar
.