這篇文章主要講解了“Java事件與錯(cuò)誤處理方法是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java事件與錯(cuò)誤處理方法是什么”吧!
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),漳縣企業(yè)網(wǎng)站建設(shè),漳縣品牌網(wǎng)站建設(shè),網(wǎng)站定制,漳縣網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,漳縣網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
12.1事件處理
傳授新知
消息驅(qū)動(dòng)、事件處理是面向?qū)ο缶幊碳夹g(shù)的主要特點(diǎn),它一改過程語言的順序執(zhí)行,整個(gè)程序以程序代碼為主線地思想,而是變成了由用戶,使用程序的用戶為主線的思想。
通俗地說,以前的程序設(shè)計(jì)思想中,整個(gè)程序的運(yùn)行流程是以程序本身為主的,整個(gè)運(yùn)行流程是在程序中預(yù)定義的。而在面向?qū)ο蟮某绦蛟O(shè)計(jì)思想中,則是讓用戶來掌握主動(dòng)權(quán),整個(gè)運(yùn)行流程是由用戶來決定的。應(yīng)用程序一旦構(gòu)建完GUI后,它就不再工作,而是等待,等待用戶通過鼠標(biāo)、鍵盤給它通知(消息驅(qū)動(dòng)),它再根據(jù)這個(gè)通知的內(nèi)容進(jìn)行相應(yīng)的處理(事件處理)。
我們來回顧一下,在我們講解使用“按鈕”時(shí),曾經(jīng)在程序中使用過這樣的一段程序:
button1.addActionListener(new
ActionListener()
{
public void actionPerformed(ActionEvent
evt)
{
Toolkit.getDefaultToolkit().beep();
}
});
當(dāng)時(shí),我們已經(jīng)對(duì)它的功能做了描述:首先為按鈕buuton1增加了一個(gè)事件監(jiān)測(cè)器,這個(gè)事件監(jiān)測(cè)器用來監(jiān)測(cè)按鈕是否按下(ActionEvent)。另外,我們還編寫了一個(gè)事件處理的程序段:
public
void actionPerformed(ActionEvent
evt)
{
Toolkit.getDefaultToolkit().beep();
}
當(dāng)按鈕按下時(shí),就會(huì)執(zhí)行這個(gè)程序段,也就執(zhí)行了Toolkit.getDefault.Toolkit().beep()方法,即響了一聲鈴。
在程序中要編寫“事件處理”程序段時(shí),通??梢苑譃橐韵聨讉€(gè)步驟來做:
1.確定事件類型
幾乎用戶使用鼠標(biāo)、鍵盤做的每一個(gè)動(dòng)作都會(huì)引起一個(gè)消息,也就是會(huì)引發(fā)一個(gè)事件,但我們并不是要對(duì)這些所有的事件都做出反應(yīng),有些事件并不是我們所關(guān)心的。對(duì)于不同的部件,我們需要關(guān)心的事件往往不同。下表中列出了最常用到的幾個(gè)事件。
部件 事件類型 事件描述
JButton ActionEvent 按下了按鈕
CheckBox
ActionEvent 選擇或取消選擇復(fù)選框
JTextField ActionEvent
用戶輸入文本輸入回車鍵
表12-1
常用部件-事件一覽表
2.為部件增加一個(gè)該事件的監(jiān)測(cè)器
每一種事件類型都有一個(gè)相應(yīng)的接口,通常名為XXXListener,其中XXX代表它所處理的事件類型。這些接口包含在java.awt.event和javax.swing.event包中。例如:
button1.addActionListener(new
ActionListener()
{
……
});
3.增加事件處理程序
最后,我們就要往里面增加血肉,實(shí)際的事件處理程序。
正如你所看到的一樣,編寫事件處理程序并不是一件簡(jiǎn)單的事,要寫好事件處理程序更不是那么簡(jiǎn)單。由于本書是一本Java的入門性書籍,所以并沒有把每個(gè)部件的全部事件都列舉出來,做一個(gè)一一講解。在此,只求大家能夠通過學(xué)習(xí)對(duì)事件處理過程有一個(gè)粗略地了解,以便大家能夠?qū)W習(xí)、研究各種與事件處理相關(guān)的知識(shí)。
實(shí)例說明
我們?cè)?jīng)在第10章中使用過Frame來構(gòu)建小應(yīng)用程序,當(dāng)時(shí)我們可以看到程序執(zhí)行時(shí)是新彈出了一個(gè)窗口,也就是一個(gè)Frame,這個(gè)Frame有最大化、最小化、關(guān)閉按鈕。不知各位讀者是否注意到,在這個(gè)Frame中呢,關(guān)閉按鈕并沒有生效,這是因?yàn)樵诔绦蛑胁⑽炊x對(duì)這個(gè)事件的處理。下面我們來看一段程序,看一下它是如何使這個(gè)關(guān)閉按鈕生效的。根據(jù)慣例,我們首先創(chuàng)建一個(gè)源程序:
源程序:closeTest.java
import
javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class
closeTest
{
public static void main(String args[])
{
Frame
frame1=new Frame("This is a Frame");
frame1.addWindowListener(new
WindowAdapter()
{
public void windowClosing(WindowEvent
e)
{
System.exit(0);
}
});
frame1.setSize(200,200);
frame1.show();
}
}
這是一個(gè)Java的應(yīng)用程序,我們首先使用javac編譯,然后執(zhí)行:
java
closeTest
來執(zhí)行這個(gè)程序,程序的輸出極為簡(jiǎn)單:
圖12-1
程序closeTest.java的輸出
一些提示:
這個(gè)程序也從側(cè)面說明了,我們?cè)贘ava的應(yīng)用程序中也可以使用GUI界面,雖然我們一直使用Java小應(yīng)用程序(Applet)來舉例。
程序的輸出是一個(gè)空白的Frame,大家現(xiàn)在按下關(guān)閉按鈕,你會(huì)發(fā)現(xiàn),這個(gè)Frame馬上被關(guān)閉了。我們實(shí)現(xiàn)了我們的目標(biāo)。
傳授新知
下面,我們一起來看一下這個(gè)程序:
1)
public
static void main(String
args[])
大家應(yīng)該還記得,一個(gè)Java應(yīng)用程序(Application)是從main方法開始執(zhí)行的吧!
2)
Frame
frame1=new Frame("This is a
Frame");
在這時(shí),我們定義了一個(gè)Frame,這個(gè)我們學(xué)習(xí)過了,不會(huì)多說。
3)
frame1.addWindowListener(new
WindowAdapter()
{
public void windowClosing(WindowEvent
e)
{
System.exit(0);
}
});
這段程序是本節(jié)最重要的內(nèi)容。它為容器frame1增加了一個(gè)有關(guān)window(窗口)的事件監(jiān)測(cè)器。監(jiān)測(cè)的事件是什么?是windowClosing,也就是按下關(guān)閉按鈕。
如果監(jiān)測(cè)到這個(gè)按鈕被按下時(shí),就執(zhí)行System.exit(0)退出程序。
4)
frame1.setSize(200,200);
frame1.show();
這兩句語句,大家應(yīng)該也不會(huì)陌生,我們先將Frame設(shè)置為200*200大,然后調(diào)用show方法將其顯示出來。
自測(cè)練習(xí)
1)
當(dāng)一個(gè)部件有一個(gè)事件發(fā)生,但并沒有為這個(gè)部件的這個(gè)事件指定事件監(jiān)測(cè)器,將會(huì)發(fā)生什么?________________。
a.編譯時(shí)就不會(huì)通過
b.引起Java程序發(fā)生致命錯(cuò)誤
c.忽略這個(gè)事件 d.引發(fā)默認(rèn)的事件處理
2)
通常我們使用____________方法來為一個(gè)部件增加事件監(jiān)視器。
a.addXXXListener b.XXXListener
3) 事件監(jiān)視器包含在_____________包中。
a.java.awt.happen b.java.until
c.java.awt.event
4) 按鈕按下事件名是__________。
a.PressedEvent
b.ActionEvent
5)
在Java應(yīng)用程序(Application)中不能夠使用JButton對(duì)象?_______。
a.對(duì) b.錯(cuò)
6)
僅有GUI部件可以產(chǎn)生事件?___________。
a.對(duì)
b.錯(cuò)
請(qǐng)說明理由:
____________________________________________________________________
練習(xí)答案
1)c
這個(gè)事件將被忽略,因?yàn)镴ava中并不存在默認(rèn)的事件處理。當(dāng)然也不會(huì)使Java程序異常退出,Java還不至于如此脆弱吧!
2)a
當(dāng)你遇到這種形式的語句,就是增加事件監(jiān)測(cè)器。
3)c
在java.awt.event和javax.swing.event中。
4)b ActionEven。
5)b
雖然我們一直都在以Applet為例,但這不證明,Application中不能夠使用這些GUI部件。我們完全可以使用這個(gè)GUI部件組成一個(gè)Application程序。
6)b
這是一種錯(cuò)覺,最簡(jiǎn)單的例子就是Frame,它是容器呀,其實(shí)還有許多東西可以發(fā)生事件。
12.2錯(cuò)誤處理
傳授新知
“世界上并不存在完全無錯(cuò)的程序”,我們不討論它是不是一條真理。但它的確是一條警語,它告誡我們?cè)诰帉懗绦驎r(shí)一定要注意盡可能地避免錯(cuò)誤。
程序運(yùn)行出錯(cuò)時(shí)會(huì)超出程序員的控制,使得程序“南轅北轍”,不僅無法正常完成功能,而且還會(huì)出現(xiàn)一些可怕的事情。
注意:
由于程序設(shè)計(jì)的錯(cuò)誤而引起的事故數(shù)不勝數(shù),損失最巨大的是美國(guó)的一次火箭發(fā)射,在那次悲劇中,在程序中由于錯(cuò)把“,”寫成了“;”,卻使得火箭在天上爆炸,所以為防止程序設(shè)計(jì)錯(cuò)誤花再大的人力、物力也是應(yīng)該的。
最有效的解決方法是在程序設(shè)計(jì)是,有意識(shí)地加入一些機(jī)制,使其能夠在運(yùn)行時(shí)檢測(cè)自己,在錯(cuò)誤失控之前,報(bào)告出來。
最常見的一種錯(cuò)誤處理是為每一個(gè)方法(其它語言,就是每一個(gè)函數(shù))返回一個(gè)狀態(tài)值,用來指示該方法是否成功、正確地完成了任務(wù)。當(dāng)調(diào)用這個(gè)方法的程序收到了一個(gè)錯(cuò)誤的狀態(tài)值,就能夠得知程序出錯(cuò)了,再采取有效的措施避免這個(gè)錯(cuò)誤引起的問題(最簡(jiǎn)單的方法就是退出程序,或給出提示提醒操作者)。
下面我們來考察一下簡(jiǎn)單的例子:
public
int getIndex(String emailaddr)
{
for(int
x=0;x
這個(gè)方法用來在emailaddr字符串中找到“@”符所在的位置,然后返回位置值。但細(xì)心的讀者應(yīng)該能夠很快地提出一個(gè)問題:假如emailaddr中沒有“@”符,那么這個(gè)程序?qū)⒎祷厥裁茨兀?br/>
對(duì),這就是潛在的錯(cuò)誤可能。當(dāng)emailaddr中沒有“@”符時(shí),不管返回什么值,可以確定的一點(diǎn)就是返回的值一定不正確!
然后,調(diào)用這個(gè)方法的程序并不知道它得到了一個(gè)錯(cuò)誤的返回呀!它會(huì)當(dāng)作一個(gè)正確的值繼續(xù)運(yùn)行下去。糟了,“多米諾骨牌”啟動(dòng)了!一個(gè)錯(cuò)誤引發(fā)了。
所以,我們應(yīng)該在這種時(shí)候,給調(diào)用這個(gè)方法的程序一個(gè)提示,那就是返回一個(gè)明確的錯(cuò)誤值,比如在這里我們可以使用-1來表示沒找到。使用這種思想,我們將程序改寫一下,形成:
public
int getIndex(String emailaddr)
{
for(int
x=0;x
我們?cè)谠瓉淼某绦蛑屑由狭艘痪洌簉eturn(-1),這時(shí)程序的邏輯發(fā)生了變化,當(dāng)找到時(shí)“@”符時(shí),將返回它所在的位置。而如果找不到,那么就會(huì)執(zhí)行:return(-1)。
然后我們?cè)谡{(diào)用這個(gè)方法的程序收到的返回值是-1時(shí),就能夠意識(shí)到錯(cuò)誤發(fā)生了。
自測(cè)練習(xí)
1)
請(qǐng)創(chuàng)建一個(gè)方法,在整數(shù)數(shù)組intArray查找是否有一個(gè)成員為5,有就返回它的位置。并且請(qǐng)注意加上一些錯(cuò)誤處理機(jī)制。
在這個(gè)程序中,你使用了什么錯(cuò)誤處理機(jī)制。
____________________________________________________________________
如果整型數(shù)組intArray的值是{2,5,6,9,10}那么,返回什么值?
____________________________________________________________________
如果值是{4,6,2,90,8},則返回什么值?
____________________________________________________________________
練習(xí)答案
1)
以下一個(gè)實(shí)例:
public int searchfive(int intArray[])
{
for(int
x=0;x
在這個(gè)程序中,我們采用了通用的錯(cuò)誤標(biāo)識(shí)機(jī)制,也就是說,找到數(shù)字5,返回它的位置,而找不到數(shù)字5時(shí),就返回-1。這樣可以讓調(diào)用這個(gè)方法的程序知道這個(gè)方法的執(zhí)行效果。
如果整型數(shù)組intArray的值是{2,5,6,9,10}那么將返回1。
而如果值是{4,6,2,90,8},那么將找不到5,因而返回-1。
12.3異常處理
傳授新知
然而在有些情況下,合法的返回值和標(biāo)識(shí)一個(gè)錯(cuò)誤情形的返回值之間不能明確區(qū)分。這種情況下錯(cuò)誤出現(xiàn)的地方,稱為異常情形。這個(gè)異常錯(cuò)誤是致命錯(cuò)誤,經(jīng)常使得程序異常退出。
在Java語言中,提供了一些處理這些異常情況的工具,能夠較好的處理這些情況,使得Java程序更加健壯。由于這方面的內(nèi)容相對(duì)比較高級(jí),很難使用較短的篇幅來說明,所以本書(一本入門的書)僅以只言片語,與大家做一個(gè)簡(jiǎn)單的介紹。
1.異常處理的流程
在Java中,異常是由Exception類定義的對(duì)象,一旦產(chǎn)生異常,方法的正??刂屏鲿?huì)立即停止,Java虛擬機(jī)(JVM)將試圖找出能夠捕獲的處理程序并處理這個(gè)特定的異常。如果找不到處理程序,Exception對(duì)象將向上層傳遞,一層一層地上傳,直至程序的main方法。如果還是找不到處理程序,程序?qū)⑼顺鲞\(yùn)行。
也就是說,Java已經(jīng)預(yù)先定義了許多異常情況(使用Exception類定義),當(dāng)程序發(fā)生異常時(shí),Java虛擬機(jī)就會(huì)想辦法尋找排除異常的辦法(也就是尋找相應(yīng)的處理程序),如果在當(dāng)前方法中找不到,就會(huì)將這個(gè)異常情況報(bào)告給調(diào)用這個(gè)方法的程序段,然后繼續(xù)尋找相應(yīng)的程序。如果還找不到就再向上一層傳遞,直到程序的main方法。如果都找不到,程序就會(huì)異常退出。
2.構(gòu)建異常處理的程序
那么如何來構(gòu)建這個(gè)異常處理程序呢?我們可以通過try/catch程序結(jié)構(gòu)來設(shè)置:
try
{
……
}
catch(Exception
ex)
{
……
}
當(dāng)try塊內(nèi)的代碼產(chǎn)生了catch塊中指定的異常就跳過try塊內(nèi)的后面的代碼,而執(zhí)行catch塊內(nèi)的程序。
而如果try塊內(nèi)的代碼未產(chǎn)生catch塊中指定的異常,則跳過catch塊內(nèi)的程序。
感謝各位的閱讀,以上就是“Java事件與錯(cuò)誤處理方法是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Java事件與錯(cuò)誤處理方法是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!