Java Silver SE11 7章 例外処理 (継承,throws)
Q&A
Closed
何についての問題?
java silver se11 7章(例外処理)にでてくる問題について質問です。
継承関係があるときのthrowsについてです。
問題文と回答
【問題】
コンパイル、実行した結果は?
【回答】
15行目でコンパイルエラーが発生する。
【解説(抜粋)】
スーパークラスのgetSpeed()メソッドは、throwsを指定していませんが、
サブクラス側でchecked例外であるIOExceptionを指定しているため。
1 import java.io.*;
2 public class Mycar extend Vehicle {
3 int speed = 0;
4 int year = 1960;
5 int price = 0;
6 public static void main(String[] args){
7 System.out.println("There comes my car!");
8 }
9 int getPrice(){
10 return price;
11 }
12 int getYear() throws NullpointerExcetion{
13 return year;
14 }
15 int getSpeed() throws IOException{ // 15行目でエラー発生
16 return speed;
17 }
18 }
19 class Vehicle{
20 int getPrice() throws IOException{
21 return 500;
22 }
23 int getYear(){
24 return 1990;
25 }
26 int getSpeed(){
27 return 60;
28 }
29 }
躓いている箇所
15行目でエラーが出ることは、理由も含めて理解しています。
今回質問させていただきたい箇所は、getPriceについてです。
getPrice()は、
親クラス → int getPrice() throws IOException{
子クラス → int getPrice(){
となっています。
私の理解では、(解説にも記載がある通り)スーパークラスで定義したメソッドに
throwsで例外クラスを指定している場合で、その例外クラスがチェックされる例外
であるとき、サブクラスでそのメソッドをオーバーライドする場合には、
同じ例外クラスorその例外クラスのサブクラスをthrowsで指定する必要がある。
ということです。
getPrice()は親クラスでchecked例外のIOExceptionをthrowsしているので、
子クラス側でもIOExceptionをthrowsしなければいけないという認識ですが、
解説ではgetPrice(), getYear()のオーバーライドに問題はありません。
とありました。
オーバーライドには問題がないと理解するためには、私の認識をどう正すべきでしょうか。
サポートいただけますと助かりますm(_ _)m
よろしくお願いいたします。