版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第二章 流程控制與異常處理,目錄,2.1 分支結(jié)構(gòu)2.2 循環(huán)結(jié)構(gòu) 2.3 異常處理,2.1 分支結(jié)構(gòu),if語句 簡單if語句(單分支結(jié)構(gòu))if(布爾表達(dá)式){ 語句;},if…else語句(雙分支結(jié)構(gòu)) if(布爾表達(dá)式) { 語句1;}else {圖2-2 雙分支結(jié)構(gòu)流程圖 語句2;},嵌套if語句(嵌套結(jié)構(gòu)) 嵌套if語句是指在if語句中又包含if語句。,多選擇if語句(多分支結(jié)構(gòu))
2、if(布爾表達(dá)式1){ 語句1;}else if(布爾表達(dá)式2) { 語句2;}... ... else if(布爾表達(dá)式n){ 語句n;} else{ 語句n+1;},例如,下面的程序?qū)崿F(xiàn)輸入成績mark,輸出對應(yīng)的等級: 優(yōu)(90≤mark≤100) 良(80≤mark<90) 中(70≤mark<80) 及格(60≤mark<70)
3、 不及格(mark<60),案例2-1 求一元二次程的根設(shè)計程序求一元二次方程的根,要求輸入二次方程的三個系數(shù),能夠判斷是否為二次方程,如果是二次方程,根據(jù)判別式,按不同的情況求出方程的根。,switch語句switch(表達(dá)式){case 常量表達(dá)式1: 語句1; [break;]case常量表達(dá)式2: 語句2; [break;] ......c
4、ase常量表達(dá)式n: 語句n; [break;] [default : 語句n+1; [break;]]},使用switch語句需要注意以下幾個問題:switch之后括號內(nèi)的表達(dá)式必須兼容int,可以是byte、short、int、char以及枚舉類型,不能是長整型或其他任何類型。在case后的各常量表達(dá)式的值不能相同,否則會出現(xiàn)錯誤。在case后
5、,允許有多個語句,可以不用{}括起來。每種情況執(zhí)行完,一般使用break跳出switch結(jié)構(gòu),否則程序繼續(xù)向下執(zhí)行。case和default語句的先后順序可以變動,而不會影響程序執(zhí)行結(jié)果。但把default語句放在最后是一種良好的編程習(xí)慣。default子句可以省略不用。例如,對于前面的輸入成績輸出等級的問題,我們也可以使用switch語句解決,案例2-2 求下一天日期 輸入一個日期,求下一天的日期。,for循環(huán)for(表達(dá)
6、式1; 表達(dá)式2; 表達(dá)式3) { 語句; //循環(huán)體},2.2 循環(huán)結(jié)構(gòu),案例2-3 求素數(shù)設(shè)計程序,求2-100之間的所有素數(shù),5個一行。,while循環(huán) while(布爾表達(dá)式){ 語句; //循環(huán)體},循環(huán)嵌套 循環(huán)是可以嵌套的,即在一個循環(huán)語句的循環(huán)體中又包含循環(huán)語句。外層循環(huán)每循環(huán)一次,內(nèi)層循環(huán)都要從頭循環(huán)到最后(條件不滿足為止)。例如,輸出如圖2-10所示的九九乘法表 。,案例2-4
7、求Sin(x) 設(shè)計程序求sin(x),當(dāng)?shù)趎項的精度小于10-5時結(jié)束計算。要求用兩種方法:一重循環(huán)和二重循環(huán)。,,do…while循環(huán) do{ 語句; //循環(huán)體}while(布爾表達(dá)式); 例如,如下程序求Fibonacci數(shù)列前15項,數(shù)列a0=0,a1=1,an=an-2+an-1:,案例2-5 進(jìn)制轉(zhuǎn)換 設(shè)計一個程序,能夠?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(類型 變量 : 可迭代的表達(dá)式) { 語句; }例如:隨機(jī)產(chǎn)生20個1到100之間的整數(shù),求大于50的數(shù)的個數(shù),2.3 異常處理,異常及其體系結(jié)構(gòu) 程序的錯誤有三類:編譯錯誤、運(yùn)行錯誤和邏輯錯誤。編譯錯誤是因為沒有遵循語言的規(guī)則,它由編譯程序檢查發(fā)現(xiàn)。在運(yùn)行過程中,如果環(huán)境發(fā)現(xiàn)了一個不可執(zhí)行的操作,就會出現(xiàn)運(yùn)行時錯誤。如果程序沒有按預(yù)期的方案執(zhí)行,就是邏輯錯誤。
9、異常指的是程序運(yùn)行時出現(xiàn)的非正常情況,它中斷指令的正常執(zhí)行。Java中提供了一種獨(dú)特的處理異常的機(jī)制,通過異常來處理程序運(yùn)行中出現(xiàn)的錯誤。,Java把異常當(dāng)作對象來處理。Throwable類是所有異常和錯誤的超類,它有兩個子類:Error(錯誤)和Exception(異常)。從程序設(shè)計的角度來看,這些類可以分為以下幾類:程序無法捕獲和處理的錯誤(稱為錯誤)——Error類及其子類。描述的是內(nèi)部系統(tǒng)錯誤,如內(nèi)存溢出、鏈接錯誤等。這些異常
10、發(fā)生時,Java虛擬機(jī)會終止線程。程序能捕獲和處理的異常(稱為檢查性異常或非運(yùn)行時異常)——Exception及子類中的非RuntimeException異常。可以捕獲處理也可以不捕獲處理的異常(稱為非檢查性異?;蜻\(yùn)行時異常)——RuntimeException及其子類。例如,除零、不合適的類型轉(zhuǎn)換、下標(biāo)越界、空指針等。雖然這類異常也是由Exception派生而來,但這類異常在程序中可以捕獲處理,也可以不捕獲處理。這些異常一般是由程序
11、邏輯錯誤引起的,應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。在調(diào)試程序時,經(jīng)常會遇到這類異常,熟悉這些異常,對調(diào)試程序非常有利。,例如,下面的程序運(yùn)行后會發(fā)生運(yùn)行時異常: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 (異常類型 e){ ……// 對異常的處理}finally { …… //無論出現(xiàn)異常否
13、都要執(zhí)行的代碼},例如,下面的程序從鍵盤上讀入一個字符并顯示:package java2_3_2.exam;import java.io.IOException;public class Exam1 { public static void main(String args[]) { try { int x = System.in.read();//該語句會引發(fā)檢查性異常,必須捕獲
14、異常 System.out.println(x); } catch (IOException ex) { ex.printStackTrace(); } }},try 用try{}選定捕獲異常的范圍,由try{}所限定的代碼塊中的語句在執(zhí)行過程中可能會產(chǎn)生并拋出異常?!atchtry{}只后可以有一個或多個catch語句,用于處理所產(chǎn)生的
15、異常。catch語句有一個參數(shù),指明它所能夠捕獲的異常類型,這個類型必須是Throwable的子類。運(yùn)行時系統(tǒng)通過這個參數(shù)把異常對象傳遞給catch塊,catch塊可使用異常對象獲得異常信息:String getMessage():得到有關(guān)異常事件的信息Void printStackTrace():用來跟蹤異常事件發(fā)生時執(zhí)行堆棧的內(nèi)容。若捕獲異常的代碼塊可能會引起多個異常,這時可用多個 catch 語句分別處理不同類型的異常。捕獲
16、的順序和catch語句的順序有關(guān),當(dāng)捕獲到一個異常時,剩下的catch語句就不再進(jìn)行匹配。因此,在安排catch語句的順序時,首先應(yīng)該捕獲最特殊的異常,然后再逐漸一般化,也就是先安排子類,再安排父類。,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捕獲異常的最后一步是通過finally語句為異常處理提供一個統(tǒng)一的出口,使得在控制流轉(zhuǎn)到程序的其它部分以前,能夠?qū)Τ绦虻臓顟B(tài)作統(tǒng)一的管理。不論在try代碼塊中是否發(fā)生了異常事件,finally塊中的語句都會被執(zhí)行,即使在try和catch中有return語句。,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三個語句塊應(yīng)注意的問題 try、catch、finally三個語句塊均不能單獨(dú)使用,三者可以組成 try...catch...finally、try...catch、try...finally三種結(jié)構(gòu),catch語句可以有一個或多個,finally語句最多一個。try、catch、finally
24、三個代碼塊中變量的作用域為代碼塊內(nèi)部,分別獨(dú)立而不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定義到這些塊的外面。有多個catch的時候,只會匹配其中一個異常類并執(zhí)行catch塊代碼,而不會再執(zhí)行別的catch塊,并且匹配catch語句的順序是由上到下。 異常發(fā)生時,匹配的catch中如果拋出異常,finally之外的語句將不能被執(zhí)行。如果finally中拋出異常,finally之外有語句會出現(xiàn)編譯錯誤。,拋出異常一個異常
25、對象可以由Java虛擬機(jī)拋出,也可以由程序主動拋出。如果在產(chǎn)生異常的方法中不能確切知道該如何處理所產(chǎn)生的異常,可以將異常交給調(diào)用它的方法,為此要拋出異常。拋出異常涉及兩個關(guān)鍵字throw和throws。throw關(guān)鍵字用來拋出一個異常。如果拋出了檢查異常,則還應(yīng)該在方法頭部聲明方法可能拋出的異常類型。該方法的調(diào)用者也必須捕獲處理拋出的異常。如果拋出的是運(yùn)行時異常,則該方法的調(diào)用者可以捕獲異常,也可以不捕獲異常。 throws關(guān)鍵字用
26、于方法的聲明部分,以表明方法可能會拋出的異常類型。,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ù)計算。設(shè)計一個程序,輸入兩個整數(shù)和一個算術(shù)運(yùn)算符,根據(jù)
28、運(yùn)算符計算兩個整數(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 制程異常處理流程
- 生產(chǎn)異常處理流程
- 生產(chǎn)異常處理流程
- 品質(zhì)異常處理流程
- 并購流程控制
- 異常處理及操作流程
- 生產(chǎn)異常處理流程1
- 設(shè)備異常處理流程及規(guī)定
- 設(shè)備異常處理流程及規(guī)定
- 研發(fā)過程控制流程
- 程序的流程控制語句
- 產(chǎn)品質(zhì)量異常處理流程
- 外包業(yè)務(wù)流程控制制度
- 項目全過程控制流程與表格大全
- 軟件項目管理的流程控制分析
- 檔案捐贈工作的流程控制研究
- 外包業(yè)務(wù)流程控制業(yè)務(wù)外包需求識別流程
- smt生產(chǎn)管理之流程控制
- 基于流程優(yōu)化的快運(yùn)業(yè)務(wù)流程控制與跟蹤的研究與應(yīng)用.pdf
- 柔性MIS中的流程定義工具與流程控制引擎研究.pdf
評論
0/150
提交評論