亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

剖析Java中的事件處理與異常處理機(jī)制

 更新時(shí)間:2016年01月11日 08:48:44   作者:xiaoyao3857  
這篇文章主要介紹了Java中的事件處理與異常處理機(jī)制,講解Java是如何對(duì)事件或者異常作出響應(yīng)以及定義異常的一些方法,需要的朋友可以參考下

一、事件處理
其實(shí),由事件處理這個(gè)名字自然就想到MFC中的消息響應(yīng)機(jī)制,就我的體會(huì),它們應(yīng)該算是南桔北枳的情形吧,我懷疑Java中的事件處理這個(gè)"新瓶"應(yīng)是裝的MFC中的消息響應(yīng)這個(gè)"舊酒"。
    所謂的"事件"即如鍵盤(pán)按鍵、鼠標(biāo)點(diǎn)擊等這類由動(dòng)作或什么導(dǎo)致某個(gè)狀態(tài)改變并需要對(duì)這個(gè)改變作相應(yīng)響應(yīng)的這類改變。我們可以將Java中的事件分為按鈕、鼠標(biāo)、鍵盤(pán)、窗口、其它事件這幾大類。
    事件處理模型
 1.   基于繼承的事件處理模型(JDK1.0)
JDK1.0中,事件處理是基于繼承的,事件先發(fā)送到組件,然后沿容器層次向上傳播。沒(méi)有被組件處理的事件會(huì)自動(dòng)地繼續(xù)傳播到組件的容器?!@個(gè)與MFC中的原始事件響應(yīng)順序或者多態(tài)的響應(yīng)機(jī)制似乎一致,而后面說(shuō)的基于代理的事件處理機(jī)制似乎又與MFC的回調(diào)機(jī)制一致。
    具體的處理方法
調(diào)用action()方法或handleEvent()方法來(lái)獲取程序運(yùn)行時(shí)發(fā)生的事件,所有組件發(fā)生的事件都在此方法中處理。
    2、基于代理的事件處理模型(JDK1。1)
在這個(gè)模型中,事件被直接送往產(chǎn)生這個(gè)事件的組件,
對(duì)于每一個(gè)組件注冊(cè)一個(gè)或多個(gè)稱為監(jiān)聽(tīng)者的類,這些類包含事件處理器,用來(lái)接收和處理這個(gè)事件。
監(jiān)聽(tīng)者就是實(shí)現(xiàn)了Listener接口的類。事件是只向注冊(cè)的監(jiān)聽(tīng)者報(bào)告的對(duì)象。每個(gè)事件都有一個(gè)對(duì)應(yīng)的監(jiān)聽(tīng)者接口。
在Button對(duì)象上用鼠標(biāo)進(jìn)行點(diǎn)擊時(shí),將發(fā)送一個(gè)ActionEvent事件。這個(gè)ActionEvent事件會(huì)被使用addActionListener()方法進(jìn)行注冊(cè)的所有ActionListener的actionPerformed()方法接收。
基于代理的事件處理模型的特點(diǎn)
①事件不會(huì)被意外地處理。在層次模型中,一個(gè)事件可能傳播到容器,并在非預(yù)期的層次被處理。
②有可能創(chuàng)建并使用適配器(adapter)類對(duì)事件動(dòng)作進(jìn)行分類。
③有利于把工作分布到各個(gè)類中。
重點(diǎn)學(xué)習(xí)這種事件處理模型
3、事件
事件處理的三要素。
(1)事件源  事件源是一個(gè)事件的產(chǎn)生者,如按鈕、窗口及文本域等。
(2)事件類型  Java中所有的事件都封裝成一個(gè)類,這些事件類被集中在java.awt.event包,所有的事件類均繼承了AWTEvent類和一個(gè)方法——getSouce()方法,該方法返回發(fā)生事件的對(duì)象。
(3)事件監(jiān)聽(tīng)器  不同的類型事件發(fā)生后,由事件監(jiān)聽(tīng)器接收事件并調(diào)用相應(yīng)的事件處理方法。所有的事件監(jiān)聽(tīng)器實(shí)際上都是一個(gè)java.awt.event包中的接口,引入了java.util.EventListener接口。不同事件類型的監(jiān)聽(tīng)器具有不同的方法。
事件處理步驟
① 程序加入java.awt.event包:
Import java.awt.event;
② 給所需的事件源對(duì)象注冊(cè)事件監(jiān)聽(tīng)器:
事件源對(duì)象.addXXXListener(XXXListener);
③ 實(shí)現(xiàn)相應(yīng)的方法。如果某個(gè)監(jiān)聽(tīng)器接口包含多個(gè)方法,則需要實(shí)現(xiàn)所有的方法
例:b2.addActionListener(this)
4、事件Adapters(適配器)
實(shí)現(xiàn)每個(gè)Listener接口的所有方法的工作量是非常大的,為了方便起見(jiàn),Java語(yǔ)言提供了Adapters類,用來(lái)實(shí)現(xiàn)含有多個(gè)方法的類。
你定義的Listener可以繼承Adapter類,而且只需重寫(xiě)你所需要的方法。
例如,窗口事件對(duì)應(yīng)的監(jiān)聽(tīng)器為WindowListener,它必須實(shí)現(xiàn)多個(gè)方法,包括windowOpened()、windowClosed()、windowClosing()、WindowIconfied()、WindowDeiconfied()、WindowActivated()、WindowDeactivated(),這樣加大了不必要的編程工作量。
如果繼承了WindowAdapter,就只需實(shí)現(xiàn)其中某一個(gè)或幾個(gè)方法,不需要實(shí)現(xiàn)所有的方法。后面很多的例子都只實(shí)現(xiàn)windowClosing()一個(gè)方法,目的是在關(guān)閉窗口時(shí)退出系統(tǒng)。
4.1 按鈕事件的處理
    點(diǎn)擊按鈕所發(fā)生的事件為動(dòng)作事件
    動(dòng)作事件對(duì)應(yīng)的事件類是ActionEvent類
    動(dòng)作事件對(duì)應(yīng)的事件監(jiān)聽(tīng)器為: ActionListener
    監(jiān)聽(tīng)器的主要方法:
        actionPerformed(ActionEvent e)發(fā)生動(dòng)作事件時(shí)被調(diào)用
    實(shí)現(xiàn)動(dòng)作事件的操作工程:
        第一步,注冊(cè)動(dòng)作事件監(jiān)聽(tīng)器addActionListener(ActionListener)。
        第二步,實(shí)現(xiàn)ActionListener接口的方法:actionPerformed(ActionEvent e) 
4.2鼠標(biāo)事件的處理
    觸發(fā)鼠標(biāo)事件的事件源通常是一個(gè)容器,當(dāng)鼠標(biāo)進(jìn)入、離開(kāi)容器,或者在容器中單擊鼠標(biāo)、拖動(dòng)鼠標(biāo)等操作時(shí),都發(fā)生鼠標(biāo)事件
    鼠標(biāo)事件對(duì)應(yīng)的事件類是MouseEvent類    
    MouseEvent類中方法:
        getX()獲取鼠標(biāo)的X坐標(biāo)
        getY()獲取鼠標(biāo)的Y坐標(biāo)
        getPoint()獲取鼠標(biāo)的位置
    鼠標(biāo)事件對(duì)應(yīng)的事件監(jiān)聽(tīng)器有兩個(gè):MouseListener(或者M(jìn)ouseAdapter)對(duì)應(yīng)鼠標(biāo)事件,MouseMotionListener(或者M(jìn)ouseMotionAdapter)對(duì)應(yīng)鼠標(biāo)移動(dòng)事件。
    MouseListener(或者M(jìn)ouseAdapter)的主要方法
        MousePressed(MouseEvent e)鼠標(biāo)按下時(shí)的處理方法
        MouseReleased(MouseEvent e)鼠標(biāo)釋放時(shí)的處理方法
        MouseEntered(MouseEvent e)鼠標(biāo)進(jìn)入時(shí)的處理方法
        MouseExited(MouseEvent e)鼠標(biāo)離開(kāi)時(shí)的處理方法
        MouseClicked(MouseEvent e)鼠標(biāo)點(diǎn)擊時(shí)的處理方法

     MouseMotionListener(或者M(jìn)ouseMotionAdapter)的主要方法
        MouseMoved(MouseEvent e)鼠標(biāo)移動(dòng)時(shí)的處理方法
        MouseDraged(MouseEvent e)鼠標(biāo)拖動(dòng)時(shí)的處理方法
4.3 鍵盤(pán)事件的處理
    在具有鍵盤(pán)焦點(diǎn)的組件中按下或釋放鍵盤(pán)等操作時(shí),都發(fā)生鍵盤(pán)事件
    鍵盤(pán)事件對(duì)應(yīng)的事件類是KeyEvent類
        KeyEvent類主要方法:
            getKeyCode()獲得按下或釋放的鍵代碼
            getKeyText()獲得按下或釋放的鍵的字符串
    鍵盤(pán)事件對(duì)應(yīng)的事件監(jiān)聽(tīng)器為:KeyListener或KeyAdapter
    主要方法:
        KeyPressed(KeyEvent e)按下鍵盤(pán)時(shí)的處理方法
        KeyReleased(KeyEvent e)釋放鍵盤(pán)時(shí)的處理方法
4.4 窗口事件的處理
    有Window及其擴(kuò)展類(Frame、Dialog)等才能激發(fā)窗口事件,表示窗口處于激活/無(wú)效狀態(tài)、圖標(biāo)/非圖標(biāo)狀態(tài)或打開(kāi)/關(guān)閉狀態(tài)等
窗口事件對(duì)應(yīng)的類為WindowEvent,監(jiān)聽(tīng)器為WindowListener(或WindowAdapter)
    主要方法:
        windowOpened(WindowEvent e)打開(kāi)窗口的事件處理
        windowClosed(WindowEvent e)關(guān)閉窗口的事件處理
        windowClosing(WindowEvent e)正在關(guān)閉窗口的事件處理
        WindowActivated(WindowEvent e)激活狀態(tài)的事件處理
        WindowDeactivated(WindowEvent e)無(wú)效狀態(tài)的事件處理
4.5 其它事件的處理
    4.5.1  復(fù)選框、單選鈕事件處理
        事件類是ItemEvent :
        選項(xiàng)事件對(duì)應(yīng)的事件監(jiān)聽(tīng)器為: ItemListener
        方法:
            itemStateChanged (ItemEvent e)發(fā)生選項(xiàng)事件時(shí)被調(diào)用
    4.5.2 滾動(dòng)條事件處理
        調(diào)整事件對(duì)應(yīng)的事件類是AdjustmentEvent類 :
        調(diào)整事件對(duì)應(yīng)的事件監(jiān)聽(tīng)器為: AdjustmentListener
        方法:
            adjustmentValueChanged (AdjustmentEvent e)發(fā)生調(diào)整事件時(shí)被調(diào)用
    4.5.3 下拉列表的事件處理
        事件類是ItemEvent :
        選項(xiàng)事件對(duì)應(yīng)的事件監(jiān)聽(tīng)器為: ItemListener
        方法:
            itemStateChanged (ItemEvent e)生下拉列表發(fā)生了動(dòng)作時(shí)被調(diào)用
        (可見(jiàn),下拉列表的事件處理與事件類型、事件監(jiān)聽(tīng)器及方法與復(fù)選框、單選框的事件處理的事件類型、事件監(jiān)聽(tīng)器及方法一樣)
    4.5.4 菜單事件的處理
        菜單事件一般是當(dāng)我們點(diǎn)擊某個(gè)菜單項(xiàng)時(shí)所發(fā)生的事件。
        菜單項(xiàng)有兩種:
            MenuItem 動(dòng)作事件
            CheckboxMenuItem,選項(xiàng)事件
        MenuItem的事件處理
            第一步,給所有的MenuItem菜單項(xiàng)注冊(cè)動(dòng)作事件監(jiān)聽(tīng)器addActionListener(ActionListener)。
            第二步,實(shí)現(xiàn)ActionListener接口的方法:actionPerformed(ActionEvent e)。在該方法中用e.getSource()獲取用戶所選的菜單項(xiàng),并進(jìn)行相應(yīng)的處理。
        CheckboxMenuItem的事件處理
            第一步,給所有的CheckMenuItem菜單項(xiàng)注冊(cè)選項(xiàng)事件監(jiān)聽(tīng)器addItemListener(ItemListener)。
            第二步,實(shí)現(xiàn)ItemListener接口的方法:itemStateChanged(ItemEvent e)。在該方法中用e.getSource()獲取用戶所選的菜單項(xiàng),e.getItem()獲取用戶所選的菜單項(xiàng)的標(biāo)簽,e.getStateChange()獲取是否選中,并進(jìn)行相應(yīng)的處理。

二、異常處理
任何好的編程語(yǔ)言和編程人員都不會(huì)忽視對(duì)異常的處理,作為比較熱門(mén)的面向?qū)ο缶幊痰恼Z(yǔ)言——Java,異常處理機(jī)制自然也是其重要特色之一。
    一般解釋異常,都將其說(shuō)為:編程中的錯(cuò)誤。但是,實(shí)際上這個(gè)錯(cuò)誤可是非常頻繁,有多種,如:編譯錯(cuò)誤、運(yùn)行錯(cuò)誤(具體上又分為:系統(tǒng)運(yùn)行錯(cuò)誤和邏輯運(yùn)行錯(cuò)誤,這個(gè)什么系統(tǒng)運(yùn)行錯(cuò)誤,自己倒很少將其算作是編程中的錯(cuò)誤了,之前。)
    在JAVA中,異常是一個(gè)類,它繼承自Throwable類。每個(gè)異常類代表了運(yùn)行錯(cuò)誤(注意:是運(yùn)行錯(cuò)誤)。異常類中包含了該運(yùn)行錯(cuò)誤的信息及處理錯(cuò)誤的方法等內(nèi)容。
    Java的異常處理機(jī)制:
    每當(dāng)Java程序運(yùn)行過(guò)程中發(fā)生一個(gè)可識(shí)別的運(yùn)行錯(cuò)誤時(shí),(即該錯(cuò)誤有一個(gè)異常類與之相對(duì)應(yīng)時(shí)),系統(tǒng)都會(huì)產(chǎn)生一個(gè)相應(yīng)的該異常類的對(duì)象,(注意:叫做產(chǎn)生一個(gè)異常類對(duì)象。)即產(chǎn)生一個(gè)異常。
    一旦一個(gè)異常對(duì)象產(chǎn)生了,系統(tǒng)中就一定要有相應(yīng)的機(jī)制來(lái)處理它,確保不會(huì)產(chǎn)生死機(jī)、死循環(huán)或其他對(duì)操作系統(tǒng)的損害,從而保證了整個(gè)程序運(yùn)行的安全性
    異常和異常類:
    Error:由Java虛擬機(jī)生成并拋出,Java程序不做處理.
    Runtime Exception(被0除等系統(tǒng)錯(cuò)誤,數(shù)組下標(biāo)超范圍):由系統(tǒng)檢測(cè), 用戶的Java 程序可不做處理,系統(tǒng)將它們交給缺省的異常處理程序(注意:有缺省的異常處理).
    Exception(程序中的問(wèn)題,可預(yù)知的): Java編譯器要求Java程序必須捕獲或聲明所有的非運(yùn)行時(shí)異常
用戶自己產(chǎn)生異常
    Exception類
    構(gòu)造函數(shù):
    public Exception();
    public Exception(String  s);可以接受字符串參數(shù)傳入的信息,該信息通常是對(duì)該異常所對(duì)應(yīng)的錯(cuò)誤的描述。
    Exception類從父親Throwable那里還繼承了若干方法,其中常用的有:
    1)public String toString();
    toString()方法返回描述當(dāng)前Exception 類信息的字符串。
    2)public void printStackTrace();
    printStackTrace()方法沒(méi)有返回值,它的功能是完成一個(gè)打印操作,在當(dāng)前的標(biāo)準(zhǔn)輸出(一般就是屏幕)上打印輸出當(dāng)前例外對(duì)象的堆棧使用軌跡,也即程序先后調(diào)用執(zhí)行了哪些對(duì)象或類的哪些方法,使得運(yùn)行過(guò)程中產(chǎn)生了這個(gè)例外對(duì)象。
    系統(tǒng)定義的運(yùn)行異常
這些子類有些是系統(tǒng)事先定義好并包含在Java類庫(kù)中的,稱為系統(tǒng)定義的運(yùn)行異常
    用戶自定義的異常
    對(duì)于某個(gè)應(yīng)用所特有的運(yùn)行錯(cuò)誤,則需要編程人員根據(jù)程序的特殊邏輯在用戶程序里自己創(chuàng)建用戶自定義的異常類和異常對(duì)象
用戶定義的異常通常采用Exception作為異常類的父類
    但是這里有一個(gè)還未弄懂的問(wèn)題:發(fā)生一個(gè)錯(cuò)誤,系統(tǒng)怎么知道是可識(shí)別的?又是怎么產(chǎn)生相應(yīng)異常類對(duì)象?異常類對(duì)象怎么就知道去用相應(yīng)方法解決?每個(gè)處理相應(yīng)異常的異常類對(duì)象難道就只有一個(gè)異常處理方法?————————————原來(lái),由用戶自定義的異常,是通過(guò)語(yǔ)句throw才拋出異常。
    創(chuàng)建用戶自定義異常時(shí),一般需要完成如下的工作:
    1)聲明一個(gè)新的異常類,使之以Exception類或其他某個(gè)已經(jīng)存在的系統(tǒng)異常類或用戶異常為父類。
    2)為新的異常類定義屬性和方法,或重載父類的屬性和方法,使這些屬性和方法能夠體現(xiàn)該類所對(duì)應(yīng)的錯(cuò)誤的信息。
    異常的拋出
     Java程序在運(yùn)行時(shí)如果引發(fā)了一個(gè)可以識(shí)別的錯(cuò)誤,就會(huì)產(chǎn)生一個(gè)與該錯(cuò)誤相對(duì)應(yīng)的異常類的對(duì)象,把這個(gè)過(guò)程叫做異常的拋出,
實(shí)際是相應(yīng)異常類對(duì)象的實(shí)例的拋出。
    根據(jù)異常類的不同,拋出異常的方式有系統(tǒng)自動(dòng)拋出和用戶拋出兩種:
    1、系統(tǒng)自動(dòng)拋出
    所用的系統(tǒng)定義的運(yùn)行錯(cuò)誤異常都是由系統(tǒng)自動(dòng)地拋出
    2、用戶拋出
    用戶自定義的異常不可能依靠系統(tǒng)自動(dòng)拋出,而必須由用戶用Java語(yǔ)句拋出,在Java語(yǔ)句中,throw語(yǔ)句用來(lái)明確地拋出一個(gè)“異常”
    用throw語(yǔ)句拋出的格式
        返回類型 方法名(參數(shù)列表) throws 要拋出的異常類名列表{
                    …
                throw 異常類實(shí)例;//注意這里
                    …
         }
     注意:
    1)一般當(dāng)程序中滿足某個(gè)條件時(shí)才拋出異常;
    往往把throw語(yǔ)句放在if語(yǔ)句的if分支中,
            if(I>100)
            throw (new MyException());
     2)含有throw的語(yǔ)句的方法,應(yīng)當(dāng)在方法頭定義中增加如下的部分:
        throws 要拋出的異常類名列表
        這樣做主要是為了通知欲調(diào)用這個(gè)方法的上層方法,準(zhǔn)備接受和處理它在運(yùn)行中可能會(huì)拋出的異常
        如果方法中的throw語(yǔ)句不止一個(gè),則應(yīng)該在方法頭throws中列出所有可能的異常
    3)Java語(yǔ)言要求所有用throws關(guān)鍵字聲明的類和用throw拋出的對(duì)象必須是Throwable類或其子類。如果你試圖拋出一個(gè)不是可拋出(Throwable)對(duì)象,Java編譯器將會(huì)報(bào)錯(cuò)
    異常處理:
    主要考慮如何捕捉異常,捕捉異常后程序如何跳轉(zhuǎn),以及如何寫(xiě)異常處理語(yǔ)句
        1.try…catch…finally 塊
    1)try
    在try語(yǔ)句的{ }中包含了可能會(huì)拋出一個(gè)或多個(gè)異常的一段程序代碼
    這些代碼實(shí)際上指定了它后面的catch塊所能捕捉的異常的范圍。
    Java程序運(yùn)行到try塊中的語(yǔ)句時(shí)如果產(chǎn)生了異常,就不再繼續(xù)執(zhí)行該try塊中其他的語(yǔ)句,而是直接進(jìn)入catch塊中尋找第一個(gè)與之匹配的異常類型并進(jìn)行處理。
    2)catch塊
    catch語(yǔ)句的參數(shù)類似于方法的定義,包括一個(gè)異常類型和一個(gè)異常對(duì)象。
    異常類型必須為T(mén)hrowable類的子類,它指明了catch語(yǔ)句所處理的異常類型;
    異常對(duì)象則由Java運(yùn)行時(shí)系統(tǒng)在try所指定的程序代碼塊中拋出的大括號(hào)中包含異常對(duì)象的處理的方法代碼。
    catch語(yǔ)句可以有多個(gè),分別處理不同類型的異常。
    Java運(yùn)行時(shí)系統(tǒng)從上到下分別對(duì)每個(gè)catch語(yǔ)句處理的異常類型進(jìn)行檢測(cè),直到找到與之相匹配的catch語(yǔ)句為止。
    這里,類型匹配指catch中的異常類型與生成的異常對(duì)象的類型完全一致或者是異常對(duì)象的父類,因此,catch語(yǔ)句的排序順序應(yīng)該是從特殊到一般。(考慮為什么?)
    3)finally塊
    finally語(yǔ)句可以說(shuō)是為異常處理事件提供的一個(gè)清理機(jī)制,一般用來(lái)關(guān)閉文件或釋放其他系統(tǒng)資源
    在try-catch-finally語(yǔ)句中可以沒(méi)有finally部分的語(yǔ)句。
    如果沒(méi)有finally部分,則當(dāng)try指定的程序代碼拋出一個(gè)異常時(shí),其他的程序代碼就不會(huì)被執(zhí)行;
    如果存在finally部分,則不論try塊中是否發(fā)生了異常,是否執(zhí)行過(guò)catch部分的語(yǔ)句,都要執(zhí)行finally部分的語(yǔ)句。
    可見(jiàn),finally部分的語(yǔ)句為異常處理提供了一個(gè)統(tǒng)一的出口。
    多異常處理   
    一個(gè)try塊可能會(huì)產(chǎn)生多種不同的異常,如果希望能采取不同的方法來(lái)處理這些例外,就需要使用多異常處理機(jī)制。
多異常處理是通過(guò)在一個(gè)try塊后面定義若干個(gè)catch塊來(lái)實(shí)現(xiàn)的,每個(gè)catch塊用來(lái)接收和處理一種特定的異常對(duì)象
通過(guò)catch塊的參數(shù)來(lái)判斷一個(gè)異常對(duì)象是否應(yīng)為本catch塊接收和處理的異常。
    被哪個(gè)catch塊獲取,根據(jù)異常對(duì)象與catch塊的異常參數(shù)的匹配情況:當(dāng)它們滿足下面三個(gè)條件的任何一個(gè)時(shí),認(rèn)為異常對(duì)象和參數(shù)匹配:
    1)異常對(duì)象與參數(shù)屬于相同的例外類。
    2)異常對(duì)象屬于參數(shù)例外類的子類。
    3)異常對(duì)象實(shí)現(xiàn)了參數(shù)所定義的接口。
    如果try塊產(chǎn)生的異常對(duì)象被第一個(gè)catch塊所接收,則程序的流程將直接跳轉(zhuǎn)到這個(gè)catch語(yǔ)句塊中,語(yǔ)句塊執(zhí)行完后就退出當(dāng)前方法,try塊中尚未執(zhí)行的語(yǔ)句和其他的catch塊將被忽略
如果try塊產(chǎn)生的異常對(duì)象與第一個(gè)catch塊不匹配,系統(tǒng)將自動(dòng)轉(zhuǎn)到第二個(gè)catch塊進(jìn)行匹配,如果第二個(gè)仍不匹配,就轉(zhuǎn)向第三個(gè)、第四個(gè)……直到找到一個(gè)可以接收該異常對(duì)象的catch塊,完成流程的跳轉(zhuǎn)。
    如果try塊產(chǎn)生的異常對(duì)象被第一個(gè)catch塊所接收,則程序的流程將直接跳轉(zhuǎn)到這個(gè)catch語(yǔ)句塊中,語(yǔ)句塊執(zhí)行完后就退出當(dāng)前方法,try塊中尚未執(zhí)行的語(yǔ)句和其他的catch塊將被忽略
    如果try塊產(chǎn)生的異常對(duì)象與第一個(gè)catch塊不匹配,系統(tǒng)將自動(dòng)轉(zhuǎn)到第二個(gè)catch塊進(jìn)行匹配,如果第二個(gè)仍不匹配,就轉(zhuǎn)向第三個(gè)、第四個(gè)……直到找到一個(gè)可以接收該異常對(duì)象的catch塊,完成流程的跳轉(zhuǎn)。
    若try塊中所有語(yǔ)句的執(zhí)行都沒(méi)有引發(fā)異常,則所有的catch塊都會(huì)被忽略而不執(zhí)行。
    注意:
    1)catch塊中的語(yǔ)句應(yīng)根據(jù)異常的不同執(zhí)行不同的操作
    所以在處理多異常時(shí)應(yīng)注意認(rèn)真設(shè)計(jì)各catch塊的排列順序。一般地處理較具體和較常見(jiàn)的異常的catch塊應(yīng)放在前面,而可以與多種異常相匹配的catch塊應(yīng)放在較后的位置。

/*嘗試用戶運(yùn)行錯(cuò)誤的異常處理: 
 問(wèn)題是這樣的,當(dāng)輸入的用戶工資初值少于800則是錯(cuò)誤的,當(dāng)然工資的變化如果超過(guò)20%,則也是錯(cuò)誤的 
*/ 
import java.awt.*; 
import java.applet.*; 
import java.awt.event.*; 
public class UserExceptionApplet extends Applet implements ActionListener{ 
 Label prompt1=new Label("請(qǐng)輸入雇員姓名和工資初值:"); 
 Label prompt2=new Label("請(qǐng)輸入欲修改的工資"); 
 TextField name,isal,nsal; 
 String msg; 
 Employee Emp; 
 Button okBtn=new Button("OK"); 
 Button cancelBtn=new Button("Cancel"); 
 public void init(){ 
  name=new TextField(5); 
  isal=new TextField(5); 
  nsal=new TextField(5); 
  add(prompt1); 
  add(name); 
  add(isal); 
  add(prompt2); 
  add(nsal); 
  add(okBtn); 
  okBtn.addActionListener(this); 
  cancelBtn.addActionListener(this); 
  add(cancelBtn); 
 } 
 public void paint(Graphics g){ 
  g.drawString(msg,0,80); 
 } 
 public void CreateEmp(String empName,double sa){ 
  try{ 
   Emp=new Employee(empName,sa); 
   msg=new String(Emp.toString()); 
  } 
  catch(IllegalSalaryException ise){ 
   msg=new String(ise.toString()); 
  } 
 } 
 public void ChangeEmpSal(double changeSal){ 
  try{ 
   Emp.setEmpSalary(changeSal); 
   msg=new String(Emp.toString()); 
  } 
  catch(IllegalSalaryException illSal){ 
   msg=new String(illSal.toString()); 
  } 
  catch(IllegalSalaryChangeException illSalChange){ 
   msg=new String(Emp.toString()+illSalChange.toString()); 
  } 
 } 
 public void actionPerformed(ActionEvent e){ 
  String empName; 
  double empSal,changeSal; 
  Object obj=e.getSource(); 
  if(obj==okBtn){ 
   empName=new String(name.getText()); 
   if(empName==null){ 
    msg=new String("請(qǐng)先輸入雇員姓名工資并創(chuàng)建之");  
   } 
   if(nsal.getText()==null){ 
    empSal=Double.valueOf(isal.getText()).doubleValue(); 
    CreateEmp(empName,empSal); 
   } 
   else{ 
    changeSal=Double.valueOf(nsal.getText()).doubleValue(); 
    ChangeEmpSal(changeSal); 
   } 
  } 
  if(obj==cancelBtn){ 
   naem.setText(""); 
   isal.setText(""); 
   nsal.setText(""); 
  } 
  repaint(); 
 }  
} 
 
class Employee{ 
 String m_EmpName; 
 double m_EmpSalary; 
  
 Employee(String name,double initsalary)throws IllegalSalaryException{ 
  m_EmpName=name;//看這里有問(wèn)題沒(méi),參考代碼為m_EmpName=new String(name); 
  if(initsalary<800){ 
   throw(new IllegalSalaryException(this,initsalary));//throw語(yǔ)句 
  } 
  m_EmpSalary=initsalary; 
 } 
 public String getEmpName(){ 
  return m_EmpName; 
 } 
 public double getEmpSalary(){ 
  return m_EmpSalary; 
 } 
  
 public boolean setEmpSalary(double newSal) throws IllegalSalaryException,IllegalSalaryChangeException{ 
  if(newSal<800) 
   throw(new IllegalSalaryException(this,newSal)); 
  else if(getEmpSalary()==0.0){ 
   m_EmpSalary=newSal; 
   return true; 
  } 
  else if(Math.abs(newSal-getEmpSalary())/getEmpSalary()>=0.2) 
   throw(new IllegalSalaryChangeException(this,newSal-getEmpSalary()));  
  else{ 
   m_EmpSalary=newSal; 
   return true; 
  } 
 } 
 public String toString(){ 
  String s; 
  s="姓名:"+m_EmpName+"工資: "+m_EmpSalary; 
  return s; 
 } 
} 
 
class IllegalSalaryException extends Exception{ 
 private Employee m_ConcernedEmp; 
 private double m_IllegalSalary; 
 
 IllegalSalaryException(Employee emp,double isal){ 
  super("工資低于最低工資"); 
  m_ConcernedEmp=emp; 
  m_IllegalSalary=isal; 
 } 
 public String toString(){ 
  String s; 
  s="為雇員提供的工資不合法:雇員:"+m_ConcernedEmp.getEmpName()+"非法工資:"+m_IllegalSalary+"低于最低工資數(shù)額800元"; 
  return s; 
 } 
} 
 
class IllegalSalaryChangeException extends Exception{ 
 private Employee m_ConcernedEmp; 
 private double m_IllegalSalaryChange; 
 
 IllegalSalaryChangeException(Employee emp,double csal){ 
  super("工資變動(dòng)太大"); 
  m_ConcernedEmp=emp; 
  m_IllegalSalaryChange=csal; 
 } 
 public String toString(){ 
  String s; 
  s="為雇員提供的工資變動(dòng)不合法:雇員:"+m_ConcernedEmp.getEmpName()+"非法變動(dòng)工資變化:"+m_IllegalSalaryChange+"高于原工資的20%"; 
  return s; 
 } 
} 

相關(guān)文章

  • Java字符串String相關(guān)類常用方法詳解

    Java字符串String相關(guān)類常用方法詳解

    這篇文章主要介紹了Java中的字符串?dāng)?shù)據(jù)類型,包括字符串的創(chuàng)建、拼接、比較和常用方法,還介紹了StringBuilder和StringJoiner類的定義和使用,以及它們?cè)趦?nèi)存中的管理方式,需要的朋友可以參考下
    2025-02-02
  • SpringData @Query和@Modifying注解原理解析

    SpringData @Query和@Modifying注解原理解析

    這篇文章主要介紹了SpringData @Query和@Modifying注解原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java詳解多線程協(xié)作作業(yè)之信號(hào)同步

    Java詳解多線程協(xié)作作業(yè)之信號(hào)同步

    信號(hào)量同步是指在不同線程之間,通過(guò)傳遞同步信號(hào)量來(lái)協(xié)調(diào)線程執(zhí)行的先后次序。CountDownLatch是基于時(shí)間維度的Semaphore則是基于信號(hào)維度的
    2022-05-05
  • SpringBoot統(tǒng)一數(shù)據(jù)返回的幾種方式

    SpringBoot統(tǒng)一數(shù)據(jù)返回的幾種方式

    在Web應(yīng)用程序開(kāi)發(fā)中,統(tǒng)一數(shù)據(jù)返回格式對(duì)于前后端分離項(xiàng)目尤為重要,本文就來(lái)介紹一下SpringBoot統(tǒng)一數(shù)據(jù)返回的幾種方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-07-07
  • java中Spring Security的實(shí)例詳解

    java中Spring Security的實(shí)例詳解

    這篇文章主要介紹了java中Spring Security的實(shí)例詳解的相關(guān)資料,spring security是一個(gè)多方面的安全認(rèn)證框架,提供了基于JavaEE規(guī)范的完整的安全認(rèn)證解決方案,需要的朋友可以參考下
    2017-09-09
  • 建議你使用LocalDateTime而不是Date哦

    建議你使用LocalDateTime而不是Date哦

    這篇文章主要介紹了建議你使用LocalDateTime而不是Date,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 簡(jiǎn)單了解Java字符串(操作)

    簡(jiǎn)單了解Java字符串(操作)

    這篇文章主要介紹了Java字符串(操作),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面小編和大家一起來(lái)學(xué)習(xí)吧
    2019-05-05
  • Spring中的依賴注入DI詳解

    Spring中的依賴注入DI詳解

    這篇文章主要介紹了Spring中的依賴注入DI詳解,組件之間依賴關(guān)系由容器在運(yùn)行期決定,形象的說(shuō),即由容器動(dòng)態(tài)的將依賴關(guān)系注入到組件之中,依賴注入的目的并非為軟件系統(tǒng)帶來(lái)更多功能,是為了提升組件重用的頻率,并為系統(tǒng)搭建一個(gè)靈活、可擴(kuò)展的平臺(tái),需要的朋友可以參考下
    2024-01-01
  • RocketMQ消息拉取過(guò)程詳解

    RocketMQ消息拉取過(guò)程詳解

    這篇文章主要為大家介紹了RocketMQ消息拉取過(guò)程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Spring Boot使用Log4j2的實(shí)例代碼

    Spring Boot使用Log4j2的實(shí)例代碼

    這篇文章主要介紹了Spring Boot使用Log4j2的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07

最新評(píng)論