流程控制與異常處理_第1頁(yè)
已閱讀1頁(yè),還剩35頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第二章 流程控制與異常處理,目錄,2.1 分支結(jié)構(gòu)2.2 循環(huán)結(jié)構(gòu) 2.3 異常處理,2.1 分支結(jié)構(gòu),if語(yǔ)句 簡(jiǎn)單if語(yǔ)句(單分支結(jié)構(gòu))if(布爾表達(dá)式){ 語(yǔ)句;},if…else語(yǔ)句(雙分支結(jié)構(gòu)) if(布爾表達(dá)式) { 語(yǔ)句1;}else {圖2-2 雙分支結(jié)構(gòu)流程圖 語(yǔ)句2;},嵌套if語(yǔ)句(嵌套結(jié)構(gòu)) 嵌套if語(yǔ)句是指在if語(yǔ)句中又包含if語(yǔ)句。,多選擇if語(yǔ)句(多分支結(jié)構(gòu))

2、if(布爾表達(dá)式1){ 語(yǔ)句1;}else  if(布爾表達(dá)式2) { 語(yǔ)句2;}... ... else  if(布爾表達(dá)式n){  語(yǔ)句n;} else{ 語(yǔ)句n+1;},例如,下面的程序?qū)崿F(xiàn)輸入成績(jī)mark,輸出對(duì)應(yīng)的等級(jí): 優(yōu)(90≤mark≤100) 良(80≤mark<90) 中(70≤mark<80) 及格(60≤mark<70)

3、 不及格(mark<60),案例2-1 求一元二次程的根設(shè)計(jì)程序求一元二次方程的根,要求輸入二次方程的三個(gè)系數(shù),能夠判斷是否為二次方程,如果是二次方程,根據(jù)判別式,按不同的情況求出方程的根。,switch語(yǔ)句switch(表達(dá)式){case 常量表達(dá)式1:  語(yǔ)句1; [break;]case常量表達(dá)式2:  語(yǔ)句2; [break;] ......c

4、ase常量表達(dá)式n: 語(yǔ)句n; [break;] [default : 語(yǔ)句n+1; [break;]]},使用switch語(yǔ)句需要注意以下幾個(gè)問(wèn)題:switch之后括號(hào)內(nèi)的表達(dá)式必須兼容int,可以是byte、short、int、char以及枚舉類(lèi)型,不能是長(zhǎng)整型或其他任何類(lèi)型。在case后的各常量表達(dá)式的值不能相同,否則會(huì)出現(xiàn)錯(cuò)誤。在case后

5、,允許有多個(gè)語(yǔ)句,可以不用{}括起來(lái)。每種情況執(zhí)行完,一般使用break跳出switch結(jié)構(gòu),否則程序繼續(xù)向下執(zhí)行。case和default語(yǔ)句的先后順序可以變動(dòng),而不會(huì)影響程序執(zhí)行結(jié)果。但把default語(yǔ)句放在最后是一種良好的編程習(xí)慣。default子句可以省略不用。例如,對(duì)于前面的輸入成績(jī)輸出等級(jí)的問(wèn)題,我們也可以使用switch語(yǔ)句解決,案例2-2 求下一天日期 輸入一個(gè)日期,求下一天的日期。,for循環(huán)for(表達(dá)

6、式1; 表達(dá)式2; 表達(dá)式3) { 語(yǔ)句; //循環(huán)體},2.2 循環(huán)結(jié)構(gòu),案例2-3 求素?cái)?shù)設(shè)計(jì)程序,求2-100之間的所有素?cái)?shù),5個(gè)一行。,while循環(huán) while(布爾表達(dá)式){ 語(yǔ)句; //循環(huán)體},循環(huán)嵌套 循環(huán)是可以嵌套的,即在一個(gè)循環(huán)語(yǔ)句的循環(huán)體中又包含循環(huán)語(yǔ)句。外層循環(huán)每循環(huán)一次,內(nèi)層循環(huán)都要從頭循環(huán)到最后(條件不滿(mǎn)足為止)。例如,輸出如圖2-10所示的九九乘法表 。,案例2-4

7、求Sin(x) 設(shè)計(jì)程序求sin(x),當(dāng)?shù)趎項(xiàng)的精度小于10-5時(shí)結(jié)束計(jì)算。要求用兩種方法:一重循環(huán)和二重循環(huán)。,,do…while循環(huán) do{ 語(yǔ)句; //循環(huán)體}while(布爾表達(dá)式); 例如,如下程序求Fibonacci數(shù)列前15項(xiàng),數(shù)列a0=0,a1=1,an=an-2+an-1:,案例2-5 進(jìn)制轉(zhuǎn)換 設(shè)計(jì)一個(gè)程序,能夠?qū)⑹M(jìn)制整數(shù)轉(zhuǎn)換成其他進(jìn)制(二進(jìn)制、八進(jìn)制和十六進(jìn)制)表示的整數(shù),也能

8、將其他進(jìn)制表示的整數(shù)換為十進(jìn)制整數(shù)。,迭代循環(huán) for(類(lèi)型 變量 : 可迭代的表達(dá)式) { 語(yǔ)句; }例如:隨機(jī)產(chǎn)生20個(gè)1到100之間的整數(shù),求大于50的數(shù)的個(gè)數(shù),2.3 異常處理,異常及其體系結(jié)構(gòu) 程序的錯(cuò)誤有三類(lèi):編譯錯(cuò)誤、運(yùn)行錯(cuò)誤和邏輯錯(cuò)誤。編譯錯(cuò)誤是因?yàn)闆](méi)有遵循語(yǔ)言的規(guī)則,它由編譯程序檢查發(fā)現(xiàn)。在運(yùn)行過(guò)程中,如果環(huán)境發(fā)現(xiàn)了一個(gè)不可執(zhí)行的操作,就會(huì)出現(xiàn)運(yùn)行時(shí)錯(cuò)誤。如果程序沒(méi)有按預(yù)期的方案執(zhí)行,就是邏輯錯(cuò)誤。

9、異常指的是程序運(yùn)行時(shí)出現(xiàn)的非正常情況,它中斷指令的正常執(zhí)行。Java中提供了一種獨(dú)特的處理異常的機(jī)制,通過(guò)異常來(lái)處理程序運(yùn)行中出現(xiàn)的錯(cuò)誤。,Java把異常當(dāng)作對(duì)象來(lái)處理。Throwable類(lèi)是所有異常和錯(cuò)誤的超類(lèi),它有兩個(gè)子類(lèi):Error(錯(cuò)誤)和Exception(異常)。從程序設(shè)計(jì)的角度來(lái)看,這些類(lèi)可以分為以下幾類(lèi):程序無(wú)法捕獲和處理的錯(cuò)誤(稱(chēng)為錯(cuò)誤)——Error類(lèi)及其子類(lèi)。描述的是內(nèi)部系統(tǒng)錯(cuò)誤,如內(nèi)存溢出、鏈接錯(cuò)誤等。這些異常

10、發(fā)生時(shí),Java虛擬機(jī)會(huì)終止線(xiàn)程。程序能捕獲和處理的異常(稱(chēng)為檢查性異?;蚍沁\(yùn)行時(shí)異常)——Exception及子類(lèi)中的非RuntimeException異常??梢圆东@處理也可以不捕獲處理的異常(稱(chēng)為非檢查性異常或運(yùn)行時(shí)異常)——RuntimeException及其子類(lèi)。例如,除零、不合適的類(lèi)型轉(zhuǎn)換、下標(biāo)越界、空指針等。雖然這類(lèi)異常也是由Exception派生而來(lái),但這類(lèi)異常在程序中可以捕獲處理,也可以不捕獲處理。這些異常一般是由程序

11、邏輯錯(cuò)誤引起的,應(yīng)該從邏輯角度盡可能避免這類(lèi)異常的發(fā)生。在調(diào)試程序時(shí),經(jīng)常會(huì)遇到這類(lèi)異常,熟悉這些異常,對(duì)調(diào)試程序非常有利。,例如,下面的程序運(yùn)行后會(huì)發(fā)生運(yùn)行時(shí)異常:package java2_3_1.exam;public class Exam1 { public static void main(String args[]) { int a[] = {1, 2, 3, 3}; for (i

12、nt i = 0; i < 5; i++) { System.out.println(" a[" + i + "]=" + a[i]); } }},異常處理機(jī)制 處理異常的程序結(jié)構(gòu)try { ……//程 序 塊}catch (異常類(lèi)型 e){ ……// 對(duì)異常的處理}finally { …… //無(wú)論出現(xiàn)異常否

13、都要執(zhí)行的代碼},例如,下面的程序從鍵盤(pán)上讀入一個(gè)字符并顯示:package java2_3_2.exam;import java.io.IOException;public class Exam1 { public static void main(String args[]) { try { int x = System.in.read();//該語(yǔ)句會(huì)引發(fā)檢查性異常,必須捕獲

14、異常 System.out.println(x); } catch (IOException ex) { ex.printStackTrace(); } }},try  用try{}選定捕獲異常的范圍,由try{}所限定的代碼塊中的語(yǔ)句在執(zhí)行過(guò)程中可能會(huì)產(chǎn)生并拋出異常?!atchtry{}只后可以有一個(gè)或多個(gè)catch語(yǔ)句,用于處理所產(chǎn)生的

15、異常。catch語(yǔ)句有一個(gè)參數(shù),指明它所能夠捕獲的異常類(lèi)型,這個(gè)類(lèi)型必須是Throwable的子類(lèi)。運(yùn)行時(shí)系統(tǒng)通過(guò)這個(gè)參數(shù)把異常對(duì)象傳遞給catch塊,catch塊可使用異常對(duì)象獲得異常信息:String getMessage():得到有關(guān)異常事件的信息Void printStackTrace():用來(lái)跟蹤異常事件發(fā)生時(shí)執(zhí)行堆棧的內(nèi)容。若捕獲異常的代碼塊可能會(huì)引起多個(gè)異常,這時(shí)可用多個(gè) catch 語(yǔ)句分別處理不同類(lèi)型的異常。捕獲

16、的順序和catch語(yǔ)句的順序有關(guān),當(dāng)捕獲到一個(gè)異常時(shí),剩下的catch語(yǔ)句就不再進(jìn)行匹配。因此,在安排catch語(yǔ)句的順序時(shí),首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化,也就是先安排子類(lèi),再安排父類(lèi)。,package java2_3_2.exam;import java.util.Scanner;class Exam2 { public static void main(String args[]) { tr

17、y { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int b = scanner.nextInt(); int d[] = {1, 3, 4, 5, 6}; System.out.println(26/a);

18、 System.out.println(d[b]); } catch (ArithmeticException e) { System.out.println("被零除: " + e); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("數(shù)據(jù)

19、下標(biāo)越界: " + e); } }},finally捕獲異常的最后一步是通過(guò)finally語(yǔ)句為異常處理提供一個(gè)統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。不論在try代碼塊中是否發(fā)生了異常事件,finally塊中的語(yǔ)句都會(huì)被執(zhí)行,即使在try和catch中有return語(yǔ)句。,package java2_3_2.exam;import java.util.Sc

20、anner;public class Exam3 { public static void main(String args[]) throws Exception { try { Scanner scanner = new Scanner(System.in); int a = scanner.nextInt(); int b = sca

21、nner.nextInt(); int d[] = {1, 3, 4, 5, 6}; System.out.println(26/a); System.out.println(d[b]); } catch (ArithmeticException e) { System.out.println("被零除: "

22、; + e); throw e; } catch (ArrayIndexOutOfBoundsException e) { System.out.println("數(shù)據(jù)下標(biāo)越界: " + e); } finally { System.out.println("ccc"); }

23、 System.out.println("ddd"); }},try、catch、finally三個(gè)語(yǔ)句塊應(yīng)注意的問(wèn)題 try、catch、finally三個(gè)語(yǔ)句塊均不能單獨(dú)使用,三者可以組成 try...catch...finally、try...catch、try...finally三種結(jié)構(gòu),catch語(yǔ)句可以有一個(gè)或多個(gè),finally語(yǔ)句最多一個(gè)。try、catch、finally

24、三個(gè)代碼塊中變量的作用域?yàn)榇a塊內(nèi)部,分別獨(dú)立而不能相互訪(fǎng)問(wèn)。如果要在三個(gè)塊中都可以訪(fǎng)問(wèn),則需要將變量定義到這些塊的外面。有多個(gè)catch的時(shí)候,只會(huì)匹配其中一個(gè)異常類(lèi)并執(zhí)行catch塊代碼,而不會(huì)再執(zhí)行別的catch塊,并且匹配catch語(yǔ)句的順序是由上到下。 異常發(fā)生時(shí),匹配的catch中如果拋出異常,finally之外的語(yǔ)句將不能被執(zhí)行。如果finally中拋出異常,finally之外有語(yǔ)句會(huì)出現(xiàn)編譯錯(cuò)誤。,拋出異常一個(gè)異常

25、對(duì)象可以由Java虛擬機(jī)拋出,也可以由程序主動(dòng)拋出。如果在產(chǎn)生異常的方法中不能確切知道該如何處理所產(chǎn)生的異常,可以將異常交給調(diào)用它的方法,為此要拋出異常。拋出異常涉及兩個(gè)關(guān)鍵字throw和throws。throw關(guān)鍵字用來(lái)拋出一個(gè)異常。如果拋出了檢查異常,則還應(yīng)該在方法頭部聲明方法可能拋出的異常類(lèi)型。該方法的調(diào)用者也必須捕獲處理拋出的異常。如果拋出的是運(yùn)行時(shí)異常,則該方法的調(diào)用者可以捕獲異常,也可以不捕獲異常。 throws關(guān)鍵字用

26、于方法的聲明部分,以表明方法可能會(huì)拋出的異常類(lèi)型。,package java2_3_3.exam;class Exam1 { static void demoproc() { try { throw new NullPointerException("空指針"); } catch (NullPointerException e) {

27、 System.out.println("在方法demoproc中捕獲"); throw e; //拋出異常 } } public static void main(String args[]) { demoproc(); //可以不捕獲異常 }},案例2-6 整數(shù)的算術(shù)計(jì)算。設(shè)計(jì)一個(gè)程序,輸入兩個(gè)整數(shù)和一個(gè)算術(shù)運(yùn)算符,根據(jù)

28、運(yùn)算符計(jì)算兩個(gè)整數(shù)的運(yùn)算結(jié)果。,自定義異常 class MyException extends Exception { public MyException(String message) { super(message); } public MyException() { super("我的異常"); }},public class Exam1

29、 { static void f() throws MyException { throw new MyException(); } public static void main(String args[]) { try { f(); } catch (MyException ex) { //ex.printStac

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論