С учетом сигнатуры метода A bar(B q) выбрасывает C, что из следующего не скомпилируется?
public class A extends Exception {....}
public class B extends A {....}
public class C extends RuntimeException {....}
С учетом сигнатуры метода A bar(B q) выбрасывает C, что из следующего не скомпилируется?
A.
A m() throws C {
return bar(new B());
}
B.
m() {
return bar(new B());
}
C. Все вышеперечисленное будет скомпилировано.
Ответ - C. Может быть, опечатка с B, не уверен. Я не понимаю этот вопрос, концептуально, что он задает и т. Д. Я получаю, что A является суперклассом B, а C является единственным в качестве RuntimeException, поэтому он не проверяется во время компиляции?
И я понимаю, что внутренняя часть метода должна быть исключением времени B, которое работает в обоих ответах. Может кто-нибудь помочь объяснить, почему оба из них компилируются?
1 ответ
C
является своего рода исключением во время выполнения. Вам не нужно объявлять исключение во время выполнения, и они игнорируются компилятором.
Вот хорошее объяснение, чтобы начать.
Объявление исключения не означает, что обязательно будет исключение. Это просто означает, что мы должны быть готовы к тому, что возникнет исключение.
Вариант B не будет компилироваться, но не из-за исключения. Он не скомпилируется, потому что нет возвращаемого типа. Вариант А объявил возврат типа A
,