一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 基于java涉及父子類的異常詳解

基于java涉及父子類的異常詳解

2020-06-12 14:04jingxian JAVA教程

下面小編就為大家帶來一篇基于java涉及父子類的異常詳解。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

java中的異常涉及到父子類的問題,可以歸納為一句話:子類的構造函數拋出的異常必須包含父類的異常,子類的方法可以選擇拋出“范圍小于等于”父類的異常或不拋出異常。

1. 為什么構造函數必須拋出包含父類的異常?

在《thingking in java》中有這么一段話:

異常限制:當覆蓋方法時,只能拋出在基類方法的異常說明中列出的那些異常

異常限制對構造器不起作用,你會發現StormyInning的構造器可以拋出任何異常,而不必理會基類構造函數所拋出的異常。然而因為必須構造函數必須以這樣或那樣的方式被調用,子類構造函數的異常說明必須包含基類構造器的異常說明

這段話起初一開比較繞,但是嘻嘻看一遍就會明白:

首先,異常說明只針對覆蓋方法,而構造函數明顯不在這個范圍,所以子類構造函數可以拋出任何異常,而不用顧及父類構造函數所拋出的異常。但是在new 一個子類對象的時候,父類構造函數一定會被調用,所以子類構造函數調用的對應的父類構造函數所拋出的異常就必須考慮在內,此時又因為“子類構造函數無法捕獲父類構造函數所拋出的異常(后面會提)”,所以子類構造函數必須拋出這個異常。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class SomeException extends Exception{}
 
class TheOtherException extends Exception{}
 
class BaseC
{
  public BaseC()throws SomeException{}
   
  public BaseC(int a)throws TheOtherException{}
}
 
class SubC extends BaseC
{
  public SubC() throws SomeException //如果不拋出異常就會報錯
  {
    super(); //由于調用的基類的默認構造函數, 所以要拋出SomeException
   //super(37) ; //如果將super()替換成這里,就必須拋出TheOtherException
  }
   
}

2. 為什么子類構造函數無法捕獲父類構造函數所拋出的異常?

 因為子類如果想要捕獲父類拋出的異常,就必須顯示地調用super() ; 或者super(xxx...); 然而super()和this()這些都有一個特性, 就是必須將他們放在第一行, 這與try{}catch{}相矛盾, 所以無法捕獲

3. 當子類繼承的父類和接口存在相同的方法名時,這時的處理方式就必須遵循異常限制。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class SomeException extends Exception{}
 
class TheOtherException extends Exception{}
 
interface InterF
{
  public void function()throws TheOtherException;
}
class BaseC
{
  public void function()throws SomeException{}
}
 
class SubC extends BaseC implements InterF
{
  //此時只能選擇不拋出異常
  public void function(){}
   
  //報錯:Exception SomeException is not compatible with throws clause in InterF.function()
  // public void function()throws SomeException{} ;
  //報錯:Exception TheOtherException is not compatible with throws clause in BaseC.function()
  // public void function()throws TheOtherException{} ;
}

4. 為什么子類只能拋出在基類方法的異常說明中列出的那些異常?

因為子類存在向上轉化成父類的可能性,如果允許子類隨意拋出異常的話,那么向上轉化成父類時,該方法的接口(姑且這么叫吧)會變成父類的方法類型,此時問題來了,子類會拋出異常,而父類卻無法對該異常做出處理,所以為保證對象的可替換型,強制要求“只能拋出在基類方法的異常說明中列出的那些異常”。

這里所說的“那些異常”還包括這些異常的子異常!

5. 這一點不知道算不算,也許是我比較愚鈍吧,我在看的時候想了好久才明白過來,姑且記下來吧。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class SomeException extends Exception{}
 
class BaseC
{
  public void function()throws SomeException{}//如果這里拋出的異常是一個運行時異常子類就可以不對其進行異常處理
}
 
class SubC extends BaseC
{<BR>//這兩個function()所進行的super.function()的都屬于正常的函數調用,不屬于異常處理的范圍, 但是這個函數本身要符合異常處理的規范!
/*
  public void function()throws SomeException
  {
    super.function();
  }
*/
  public void function()
  {
    try
    {
      super.function() ;
    }
    catch(SomeException e)
    {
      e.printStackTrace();
    }
  }
}

以上這篇基于java涉及父子類的異常詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九精品视频在线观看 | 2023最新伦理片 | 国产高清专区 | 8天堂资源在线官网 | 国产肥臀| 亚洲白拍 | 亚洲欧美日韩国产一区二区精品 | 99热久久这里只有精品6国产网 | 成人国产午夜在线视频 | 天堂在线中文无弹窗全文阅读 | 亚洲国产成人在人网站天堂 | 9丨精品国产高清自在线看 9久热这里只有精品免费 | 99久久99热久久精品免费看 | 色婷婷久久综合中文久久一本 | 女人爽到喷水的视频免费看 | 女教师波多野结衣高清在线 | 亚洲欧美日韩国产一区二区精品 | 精品欧美一区二区精品久久 | a看片| 好性20岁 | 日韩欧美一区黑人vs日本人 | 香蕉久久一区二区三区啪啪 | 亚洲欧美韩国日产综合在线 | 国产成人精品实拍在线 | 国产白虎 | 欧美一级特黄刺激大片视频 | 2021国产麻豆剧传媒新片 | 欧美一区二区三区免费不卡 | 久99久热只有精品国产99 | 国产麻豆精品入口在线观看 | 亚洲国产精品综合久久一线 | 国产在线观看人成激情视频 | 暖暖暖免费观看在线观看 | 欧美成人乱弄视频 | 国语精彩对白2021 | 天堂资源wwww在线看 | 国产老熟 | 亚洲欧洲日产国码无码av | 欧美性bbbbbxxxxxddd | 国产精品午夜国产小视频 | 国产亚洲精aa在线观看香蕉 |