С учетом сигнатуры метода 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,

Другие вопросы по тегам