溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java事件與錯誤處理方法是什么

發(fā)布時間:2021-12-30 17:19:46 來源:億速云 閱讀:128 作者:iii 欄目:編程語言

這篇文章主要講解了“Java事件與錯誤處理方法是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java事件與錯誤處理方法是什么”吧!

  12.1事件處理

  傳授新知

  消息驅(qū)動、事件處理是面向?qū)ο缶幊碳夹g的主要特點,它一改過程語言的順序執(zhí)行,整個程序以程序代碼為主線地思想,而是變成了由用戶,使用程序的用戶為主線的思想。

  通俗地說,以前的程序設計思想中,整個程序的運行流程是以程序本身為主的,整個運行流程是在程序中預定義的。而在面向?qū)ο蟮某绦蛟O計思想中,則是讓用戶來掌握主動權,整個運行流程是由用戶來決定的。應用程序一旦構建完GUI后,它就不再工作,而是等待,等待用戶通過鼠標、鍵盤給它通知(消息驅(qū)動),它再根據(jù)這個通知的內(nèi)容進行相應的處理(事件處理)。

  我們來回顧一下,在我們講解使用“按鈕”時,曾經(jīng)在程序中使用過這樣的一段程序:

button1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
Toolkit.getDefaultToolkit().beep();
}
});


  當時,我們已經(jīng)對它的功能做了描述:首先為按鈕buuton1增加了一個事件監(jiān)測器,這個事件監(jiān)測器用來監(jiān)測按鈕是否按下(ActionEvent)。另外,我們還編寫了一個事件處理的程序段:


public void actionPerformed(ActionEvent evt)
{
Toolkit.getDefaultToolkit().beep();
}

  當按鈕按下時,就會執(zhí)行這個程序段,也就執(zhí)行了Toolkit.getDefault.Toolkit().beep()方法,即響了一聲鈴。

  在程序中要編寫“事件處理”程序段時,通??梢苑譃橐韵聨讉€步驟來做:

  1.確定事件類型

  幾乎用戶使用鼠標、鍵盤做的每一個動作都會引起一個消息,也就是會引發(fā)一個事件,但我們并不是要對這些所有的事件都做出反應,有些事件并不是我們所關心的。對于不同的部件,我們需要關心的事件往往不同。下表中列出了最常用到的幾個事件。

  部件 事件類型 事件描述

  JButton ActionEvent 按下了按鈕

  CheckBox ActionEvent 選擇或取消選擇復選框

  JTextField ActionEvent 用戶輸入文本輸入回車鍵

  表12-1 常用部件-事件一覽表

  2.為部件增加一個該事件的監(jiān)測器

  每一種事件類型都有一個相應的接口,通常名為XXXListener,其中XXX代表它所處理的事件類型。這些接口包含在java.awt.event和javax.swing.event包中。例如:


button1.addActionListener(new ActionListener()
{
……
});

  3.增加事件處理程序

  最后,我們就要往里面增加血肉,實際的事件處理程序。

  正如你所看到的一樣,編寫事件處理程序并不是一件簡單的事,要寫好事件處理程序更不是那么簡單。由于本書是一本Java的入門性書籍,所以并沒有把每個部件的全部事件都列舉出來,做一個一一講解。在此,只求大家能夠通過學習對事件處理過程有一個粗略地了解,以便大家能夠?qū)W習、研究各種與事件處理相關的知識。

  實例說明

  我們曾經(jīng)在第10章中使用過Frame來構建小應用程序,當時我們可以看到程序執(zhí)行時是新彈出了一個窗口,也就是一個Frame,這個Frame有最大化、最小化、關閉按鈕。不知各位讀者是否注意到,在這個Frame中呢,關閉按鈕并沒有生效,這是因為在程序中并未定義對這個事件的處理。下面我們來看一段程序,看一下它是如何使這個關閉按鈕生效的。根據(jù)慣例,我們首先創(chuàng)建一個源程序:

  源程序: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();
}
}
  這是一個Java的應用程序,我們首先使用javac編譯,然后執(zhí)行:

java closeTest

  來執(zhí)行這個程序,程序的輸出極為簡單:

  圖12-1 程序closeTest.java的輸出

  一些提示:

  這個程序也從側面說明了,我們在Java的應用程序中也可以使用GUI界面,雖然我們一直使用Java小應用程序(Applet)來舉例。

  程序的輸出是一個空白的Frame,大家現(xiàn)在按下關閉按鈕,你會發(fā)現(xiàn),這個Frame馬上被關閉了。我們實現(xiàn)了我們的目標。

  傳授新知

  下面,我們一起來看一下這個程序:

  1)

public static void main(String args[])

  大家應該還記得,一個Java應用程序(Application)是從main方法開始執(zhí)行的吧!

  2)

Frame frame1=new Frame("This is a Frame");

  在這時,我們定義了一個Frame,這個我們學習過了,不會多說。

  3)

frame1.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});

  這段程序是本節(jié)最重要的內(nèi)容。它為容器frame1增加了一個有關window(窗口)的事件監(jiān)測器。監(jiān)測的事件是什么?是windowClosing,也就是按下關閉按鈕。

  如果監(jiān)測到這個按鈕被按下時,就執(zhí)行System.exit(0)退出程序。

  4)

frame1.setSize(200,200);
frame1.show();

  這兩句語句,大家應該也不會陌生,我們先將Frame設置為200*200大,然后調(diào)用show方法將其顯示出來。

  自測練習

  1) 當一個部件有一個事件發(fā)生,但并沒有為這個部件的這個事件指定事件監(jiān)測器,將會發(fā)生什么?________________。

  a.編譯時就不會通過 b.引起Java程序發(fā)生致命錯誤

  c.忽略這個事件 d.引發(fā)默認的事件處理

  2) 通常我們使用____________方法來為一個部件增加事件監(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應用程序(Application)中不能夠使用JButton對象?_______。

  a.對 b.錯

  6) 僅有GUI部件可以產(chǎn)生事件?___________。

  a.對 b.錯

  請說明理由:

  ____________________________________________________________________

  練習答案

  1)c 這個事件將被忽略,因為Java中并不存在默認的事件處理。當然也不會使Java程序異常退出,Java還不至于如此脆弱吧!

  2)a 當你遇到這種形式的語句,就是增加事件監(jiān)測器。

  3)c 在java.awt.event和javax.swing.event中。

  4)b ActionEven。

  5)b 雖然我們一直都在以Applet為例,但這不證明,Application中不能夠使用這些GUI部件。我們完全可以使用這個GUI部件組成一個Application程序。

  6)b 這是一種錯覺,最簡單的例子就是Frame,它是容器呀,其實還有許多東西可以發(fā)生事件。

  12.2錯誤處理

  傳授新知

  “世界上并不存在完全無錯的程序”,我們不討論它是不是一條真理。但它的確是一條警語,它告誡我們在編寫程序時一定要注意盡可能地避免錯誤。

  程序運行出錯時會超出程序員的控制,使得程序“南轅北轍”,不僅無法正常完成功能,而且還會出現(xiàn)一些可怕的事情。

  注意:

  由于程序設計的錯誤而引起的事故數(shù)不勝數(shù),損失最巨大的是美國的一次火箭發(fā)射,在那次悲劇中,在程序中由于錯把“,”寫成了“;”,卻使得火箭在天上爆炸,所以為防止程序設計錯誤花再大的人力、物力也是應該的。

  最有效的解決方法是在程序設計是,有意識地加入一些機制,使其能夠在運行時檢測自己,在錯誤失控之前,報告出來。

  最常見的一種錯誤處理是為每一個方法(其它語言,就是每一個函數(shù))返回一個狀態(tài)值,用來指示該方法是否成功、正確地完成了任務。當調(diào)用這個方法的程序收到了一個錯誤的狀態(tài)值,就能夠得知程序出錯了,再采取有效的措施避免這個錯誤引起的問題(最簡單的方法就是退出程序,或給出提示提醒操作者)。

  下面我們來考察一下簡單的例子:

public int getIndex(String emailaddr)
{
for(int x=0;x

  這個方法用來在emailaddr字符串中找到“@”符所在的位置,然后返回位置值。但細心的讀者應該能夠很快地提出一個問題:假如emailaddr中沒有“@”符,那么這個程序?qū)⒎祷厥裁茨兀?br/>
  對,這就是潛在的錯誤可能。當emailaddr中沒有“@”符時,不管返回什么值,可以確定的一點就是返回的值一定不正確!

  然后,調(diào)用這個方法的程序并不知道它得到了一個錯誤的返回呀!它會當作一個正確的值繼續(xù)運行下去。糟了,“多米諾骨牌”啟動了!一個錯誤引發(fā)了。

  所以,我們應該在這種時候,給調(diào)用這個方法的程序一個提示,那就是返回一個明確的錯誤值,比如在這里我們可以使用-1來表示沒找到。使用這種思想,我們將程序改寫一下,形成:


public int getIndex(String emailaddr)
{
for(int x=0;x

  我們在原來的程序中加上了一句:return(-1),這時程序的邏輯發(fā)生了變化,當找到時“@”符時,將返回它所在的位置。而如果找不到,那么就會執(zhí)行:return(-1)。

  然后我們在調(diào)用這個方法的程序收到的返回值是-1時,就能夠意識到錯誤發(fā)生了。

  自測練習

  1) 請創(chuàng)建一個方法,在整數(shù)數(shù)組intArray查找是否有一個成員為5,有就返回它的位置。并且請注意加上一些錯誤處理機制。

  在這個程序中,你使用了什么錯誤處理機制。
  ____________________________________________________________________

  如果整型數(shù)組intArray的值是{2,5,6,9,10}那么,返回什么值?
  ____________________________________________________________________

  如果值是{4,6,2,90,8},則返回什么值?
  ____________________________________________________________________

  練習答案

  1) 以下一個實例:

public int searchfive(int intArray[])
{
for(int x=0;x

  在這個程序中,我們采用了通用的錯誤標識機制,也就是說,找到數(shù)字5,返回它的位置,而找不到數(shù)字5時,就返回-1。這樣可以讓調(diào)用這個方法的程序知道這個方法的執(zhí)行效果。

  如果整型數(shù)組intArray的值是{2,5,6,9,10}那么將返回1。

  而如果值是{4,6,2,90,8},那么將找不到5,因而返回-1。

  12.3異常處理

  傳授新知

  然而在有些情況下,合法的返回值和標識一個錯誤情形的返回值之間不能明確區(qū)分。這種情況下錯誤出現(xiàn)的地方,稱為異常情形。這個異常錯誤是致命錯誤,經(jīng)常使得程序異常退出。

  在Java語言中,提供了一些處理這些異常情況的工具,能夠較好的處理這些情況,使得Java程序更加健壯。由于這方面的內(nèi)容相對比較高級,很難使用較短的篇幅來說明,所以本書(一本入門的書)僅以只言片語,與大家做一個簡單的介紹。

  1.異常處理的流程

  在Java中,異常是由Exception類定義的對象,一旦產(chǎn)生異常,方法的正??刂屏鲿⒓赐V?,Java虛擬機(JVM)將試圖找出能夠捕獲的處理程序并處理這個特定的異常。如果找不到處理程序,Exception對象將向上層傳遞,一層一層地上傳,直至程序的main方法。如果還是找不到處理程序,程序?qū)⑼顺鲞\行。

  也就是說,Java已經(jīng)預先定義了許多異常情況(使用Exception類定義),當程序發(fā)生異常時,Java虛擬機就會想辦法尋找排除異常的辦法(也就是尋找相應的處理程序),如果在當前方法中找不到,就會將這個異常情況報告給調(diào)用這個方法的程序段,然后繼續(xù)尋找相應的程序。如果還找不到就再向上一層傳遞,直到程序的main方法。如果都找不到,程序就會異常退出。

  2.構建異常處理的程序

  那么如何來構建這個異常處理程序呢?我們可以通過try/catch程序結構來設置:

try
{
……
}
catch(Exception ex)
{
……
}
  當try塊內(nèi)的代碼產(chǎn)生了catch塊中指定的異常就跳過try塊內(nèi)的后面的代碼,而執(zhí)行catch塊內(nèi)的程序。

  而如果try塊內(nèi)的代碼未產(chǎn)生catch塊中指定的異常,則跳過catch塊內(nèi)的程序。

感謝各位的閱讀,以上就是“Java事件與錯誤處理方法是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Java事件與錯誤處理方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI