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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - 剖析Java中的事件處理與異常處理機(jī)制

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

2020-03-21 12:28xiaoyao3857 JAVA教程

這篇文章主要介紹了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)放在較后的位置。

?
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*嘗試用戶運(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;
 }
}

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩精品一区二区三区中文版 | 日本伊人色综合网 | 成人免费观看在线视频 | 啊啊啊好大在线观看 | 国产精品久久久久毛片真精品 | 国产亚洲一级精品久久 | 日本在线视频网址 | 惊弦45集免费看 | 男人好大好硬好爽免费视频 | 亚洲大片免费看 | 法国女佣系列在线播放 | 69pao强力打造免费高速 | 天天射寡妇射 | 色综合久久夜色精品国产 | 日本人做受全过程视频 | 亚洲一区二区三区免费视频 | 99国产小视频 | 美女艹b| 欧美人在线一区二区三区 | 深夜视频免费看 | 亚洲成年人在线观看 | 亚洲 日韩 自拍 视频一区 | chinese男男gayxxx chinese老头和老太交hd | 亚洲图片一区二区 | 2022国产麻豆剧传媒剧情 | 久久毛片视频 | bt岛www| 性绞姿始动作动态图 | 我与么公激情性完整视频 | 微福利92合集 | 男同桌扒开女同桌胸罩喝奶 | 免费一级片在线 | 3d动漫美女被吸乳羞羞视频 | 青青99 | 村妇超级乱淫伦小说全集 | 亚久久伊人精品青青草原2020 | 美女被视频 | 婷婷伊人综合亚洲综合网 | 嫩交18xxxx| 久久艹综合 | swag最新正在播放 |