欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年09月07日 10:09:33   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇基于java涉及父子類的異常詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

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

1. 為什么構(gòu)造函數(shù)必須拋出包含父類的異常?

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

異常限制:當(dāng)覆蓋方法時(shí),只能拋出在基類方法的異常說(shuō)明中列出的那些異常

異常限制對(duì)構(gòu)造器不起作用,你會(huì)發(fā)現(xiàn)StormyInning的構(gòu)造器可以拋出任何異常,而不必理會(huì)基類構(gòu)造函數(shù)所拋出的異常。然而因?yàn)楸仨殬?gòu)造函數(shù)必須以這樣或那樣的方式被調(diào)用,子類構(gòu)造函數(shù)的異常說(shuō)明必須包含基類構(gòu)造器的異常說(shuō)明

這段話起初一開(kāi)比較繞,但是嘻嘻看一遍就會(huì)明白:

首先,異常說(shuō)明只針對(duì)覆蓋方法,而構(gòu)造函數(shù)明顯不在這個(gè)范圍,所以子類構(gòu)造函數(shù)可以拋出任何異常,而不用顧及父類構(gòu)造函數(shù)所拋出的異常。但是在new 一個(gè)子類對(duì)象的時(shí)候,父類構(gòu)造函數(shù)一定會(huì)被調(diào)用,所以子類構(gòu)造函數(shù)調(diào)用的對(duì)應(yīng)的父類構(gòu)造函數(shù)所拋出的異常就必須考慮在內(nèi),此時(shí)又因?yàn)椤白宇悩?gòu)造函數(shù)無(wú)法捕獲父類構(gòu)造函數(shù)所拋出的異常(后面會(huì)提)”,所以子類構(gòu)造函數(shù)必須拋出這個(gè)異常。

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 //如果不拋出異常就會(huì)報(bào)錯(cuò) 
  { 
    super(); //由于調(diào)用的基類的默認(rèn)構(gòu)造函數(shù), 所以要拋出SomeException 
   //super(37) ; //如果將super()替換成這里,就必須拋出TheOtherException 
  } 
   
}

2. 為什么子類構(gòu)造函數(shù)無(wú)法捕獲父類構(gòu)造函數(shù)所拋出的異常?

 因?yàn)樽宇惾绻胍东@父類拋出的異常,就必須顯示地調(diào)用super() ; 或者super(xxx...); 然而super()和this()這些都有一個(gè)特性, 就是必須將他們放在第一行, 這與try{}catch{}相矛盾, 所以無(wú)法捕獲

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

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 
{ 
  //此時(shí)只能選擇不拋出異常 
  public void function(){} 
   
  //報(bào)錯(cuò):Exception SomeException is not compatible with throws clause in InterF.function() 
  // public void function()throws SomeException{} ; 
  //報(bào)錯(cuò):Exception TheOtherException is not compatible with throws clause in BaseC.function() 
  // public void function()throws TheOtherException{} ; 
}

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

因?yàn)樽宇惔嬖谙蛏限D(zhuǎn)化成父類的可能性,如果允許子類隨意拋出異常的話,那么向上轉(zhuǎn)化成父類時(shí),該方法的接口(姑且這么叫吧)會(huì)變成父類的方法類型,此時(shí)問(wèn)題來(lái)了,子類會(huì)拋出異常,而父類卻無(wú)法對(duì)該異常做出處理,所以為保證對(duì)象的可替換型,強(qiáng)制要求“只能拋出在基類方法的異常說(shuō)明中列出的那些異?!?。

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

5. 這一點(diǎn)不知道算不算,也許是我比較愚鈍吧,我在看的時(shí)候想了好久才明白過(guò)來(lái),姑且記下來(lái)吧。

class SomeException extends Exception{} 
 
class BaseC 
{ 
  public void function()throws SomeException{}//如果這里拋出的異常是一個(gè)運(yùn)行時(shí)異常子類就可以不對(duì)其進(jìn)行異常處理 
} 
 
class SubC extends BaseC 
{<BR>//這兩個(gè)function()所進(jìn)行的super.function()的都屬于正常的函數(shù)調(diào)用,不屬于異常處理的范圍, 但是這個(gè)函數(shù)本身要符合異常處理的規(guī)范! 
/* 
  public void function()throws SomeException 
  { 
    super.function(); 
  } 
*/
  public void function() 
  { 
    try
    { 
      super.function() ; 
    } 
    catch(SomeException e) 
    { 
      e.printStackTrace(); 
    } 
  } 
}

以上這篇基于java涉及父子類的異常詳解就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java 梳理總結(jié)關(guān)于static關(guān)鍵字常見(jiàn)問(wèn)題

    Java 梳理總結(jié)關(guān)于static關(guān)鍵字常見(jiàn)問(wèn)題

    static關(guān)鍵字基本概念我們可以一句話來(lái)概括:方便在沒(méi)有創(chuàng)建對(duì)象的情況下來(lái)進(jìn)行調(diào)用。也就是說(shuō):被static關(guān)鍵字修飾的不需要?jiǎng)?chuàng)建對(duì)象去調(diào)用,直接根據(jù)類名就可以去訪問(wèn),讓我們來(lái)了解一下你可能還不知道情況
    2022-04-04
  • SpringMVC基于阻塞隊(duì)列LinkedBlockingQueue的同步長(zhǎng)輪詢功能實(shí)現(xiàn)詳解

    SpringMVC基于阻塞隊(duì)列LinkedBlockingQueue的同步長(zhǎng)輪詢功能實(shí)現(xiàn)詳解

    這篇文章主要介紹了SpringMVC基于阻塞隊(duì)列LinkedBlockingQueue的同步長(zhǎng)輪詢功能實(shí)現(xiàn)詳解,本文介紹的也是生產(chǎn)者消費(fèi)者的一種實(shí)現(xiàn),生產(chǎn)者不必是一個(gè)始終在執(zhí)行的線程,它可以是一個(gè)接口,接受客戶端的請(qǐng)求,向隊(duì)列中插入消息,需要的朋友可以參考下
    2023-07-07
  • MyBatis入門學(xué)習(xí)教程(一)-MyBatis快速入門

    MyBatis入門學(xué)習(xí)教程(一)-MyBatis快速入門

    MyBatis是一個(gè)支持普通SQL查詢,存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架,這篇文章主要給大家分享MyBatis入門學(xué)習(xí)教程(一)-MyBatis快速入門,需要的朋友可以參考下
    2015-08-08
  • Spring Security 將用戶數(shù)據(jù)存入數(shù)據(jù)庫(kù)

    Spring Security 將用戶數(shù)據(jù)存入數(shù)據(jù)庫(kù)

    這篇文章主要介紹了Spring Security 如何將用戶數(shù)據(jù)存入數(shù)據(jù)庫(kù),幫助大家更好的理解和學(xué)習(xí)Spring Security,感興趣的朋友可以了解下
    2020-09-09
  • Java中Boolean和boolean的區(qū)別詳析

    Java中Boolean和boolean的區(qū)別詳析

    boolean是基本數(shù)據(jù)類型Boolean是它的封裝類,和其他類一樣,有屬性有方法,可以new,下面這篇文章主要給大家介紹了關(guān)于Java中Boolean和boolean區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Java 選擇、冒泡排序、折半查找(實(shí)例講解)

    Java 選擇、冒泡排序、折半查找(實(shí)例講解)

    下面小編就為大家?guī)?lái)一篇Java 選擇、冒泡排序、折半查找(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • Java 匿名對(duì)象與匿名內(nèi)部類的使用

    Java 匿名對(duì)象與匿名內(nèi)部類的使用

    很多小伙伴對(duì)匿名對(duì)象和匿名內(nèi)部類的寫法有點(diǎn)陌生,本文主要介紹了Java 匿名對(duì)象與匿名內(nèi)部類的使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java代碼注釋規(guī)范(動(dòng)力節(jié)點(diǎn)整理)

    Java代碼注釋規(guī)范(動(dòng)力節(jié)點(diǎn)整理)

    代碼注釋是架起程序設(shè)計(jì)者與程序閱讀者之間的通信橋梁,最大限度的提高團(tuán)隊(duì)開(kāi)發(fā)合作效率。也是程序代碼可維護(hù)性的重要環(huán)節(jié)之一。下面通過(guò)本文說(shuō)一下我們?cè)谌粘i_(kāi)發(fā)中使用的代碼注釋規(guī)范
    2017-03-03
  • 深入理解Spring中RabbitMQ的Channel

    深入理解Spring中RabbitMQ的Channel

    這篇文章主要介紹了深入理解Spring中RabbitMQ的Channel,在RabbitMq中,channel表示邏輯連接或者叫虛擬連接,是棣屬于TCP連接的,一個(gè)TCP連接里可以創(chuàng)建多個(gè)channel,在Rabbit MQ里,消息的發(fā)送和接收都是基于channel的,需要的朋友可以參考下
    2023-08-08
  • java實(shí)現(xiàn)Api接口加密通信方式

    java實(shí)現(xiàn)Api接口加密通信方式

    這篇文章主要介紹了java實(shí)現(xiàn)Api接口加密通信方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06

最新評(píng)論