java程序設(shè)計(jì)第3章_第1頁(yè)
java程序設(shè)計(jì)第3章_第2頁(yè)
java程序設(shè)計(jì)第3章_第3頁(yè)
java程序設(shè)計(jì)第3章_第4頁(yè)
java程序設(shè)計(jì)第3章_第5頁(yè)
已閱讀5頁(yè),還剩79頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第三章 類的方法JAVA語(yǔ)言程序設(shè)計(jì)1目錄3.1 方法的控制流程3.2 異常處理簡(jiǎn)介3.3 方法的重載(overloading)3.4 本章小結(jié)23.1 方法的控制流程方法的控制流程Java程序通過(guò)控制語(yǔ)句來(lái)控制方法的執(zhí)行流程Java中的流程控制結(jié)構(gòu)主要有三種順序結(jié)構(gòu)選擇結(jié)構(gòu)if語(yǔ)句(二路選擇結(jié)構(gòu))switch語(yǔ)句(多路選擇結(jié)構(gòu))循環(huán)結(jié)構(gòu)for語(yǔ)句while語(yǔ)句do-while語(yǔ)句33.1.1 if選擇結(jié)構(gòu)語(yǔ)法形式只有if分支,沒(méi)有else分支if (boolean-expression) / statement1; if-else語(yǔ)句if (boolean-expression) / sta

2、tement1 ; else / statement2 ; 方法的控制流程43.1.1 if選擇結(jié)構(gòu)(續(xù))if-else語(yǔ)句的特殊形式if (boolean expression) /statement1;else if (boolean expression) /statement2; else if (boolean expression) /statement; else /statement; 方法的控制流程5ex3_1 輸入一個(gè)年份,判斷它是不是閏年。閏年: 能被4整除但不能被100整除,或者能被400整除。public class ex3_1 public static void

3、main(String args) throws IOException int year; boolean IsLeapYear; System.out.println(Enter the year:); BufferedReader in =new BufferedReader( new InputStreamReader(System.in); year=(new Integer(in.readLine().intValue(); 3.1.1 if選擇結(jié)構(gòu)(續(xù))ex3_1.java方法的控制流程6 IsLeapYear=(year%4=0 & year%100 != 0)|(year%4

4、00 = 0); if (IsLeapYear) System.out.print(year); System.out.println( is a leap year); else System.out.print(year); System.out.println( is not a leap year); 3.1.1 if選擇結(jié)構(gòu)(續(xù))ex3_1.java方法的控制流程7輸入兩個(gè)整數(shù)比較大小import java.io.*;public class ex3_2 public static void main(String args)throws IOException int x,y; B

5、ufferedReader in = new BufferedReader( new InputStreamReader(System.in); System.out.println(Enter x and y:); x=(new Integer(in.readLine().intValue(); y=(new Integer(in.readLine().intValue(); if (x!=y) if (xy) System.out.println(xy); else System.out.println(xb) System.out.println(The larger one is: +

6、a);else System.out.println(The larger one is: +b);用條件運(yùn)算符重寫(xiě): System.out.println(The larger one is: + (ab)?a:b);3.1.1 if選擇結(jié)構(gòu)(續(xù))以條件運(yùn)算符代替if_else方法的控制流程9計(jì)算每個(gè)月的天數(shù)static int daysInMonth(int month) if (month = 2) return(28); else if (month=4)|(month=6)|(month=9)|(month=11) return(30); else return(31); 方法的控制

7、流程3.1.1 if選擇結(jié)構(gòu)(續(xù))例3_110已知一個(gè)學(xué)生的分?jǐn)?shù),給出其分?jǐn)?shù)等級(jí)。90-100分為級(jí);80-89分為B級(jí);70-79分為級(jí);60-69分為D級(jí);0-59分為E級(jí)public class IfElseDemo public static void main(String args) int testscore = 76; char grade; if (testscore = 90) grade = A; else if (testscore = 80) grade = B; else if (testscore = 70) grade = C; else if (testsco

8、re = 60) grade = D; else grade = F; System.out.println(Grade = + grade); 程序輸出:Grade = C3.1.1 if選擇結(jié)構(gòu)(續(xù))ifElseDemo.java方法的控制流程113.1.2 switch選擇結(jié)構(gòu)switch語(yǔ)句是多分支的選擇結(jié)構(gòu)switch (switch-expression) case value1: statements for case1; break; case value2: statements for case2; break; . case valueN: statements for

9、caseN; break; default: statements for default case; break; 注意問(wèn)題switch-expression、常量值value1到valueN必須是整形或字符型如果表達(dá)式的值和某個(gè)case后面的值相同,則從該case之后開(kāi)始執(zhí)行,直到break語(yǔ)句為止default是可有可無(wú)的,若沒(méi)有一個(gè)常量與表達(dá)式的值相同,則從default之后開(kāi)始執(zhí)行方法的控制流程12if (i = 1) statementA(); else if (i = 2) statementB(); else if(i=3)|(i=4) statementC(); else i

10、f (i = 5) statementD(); else statementF(); switch (i) case 1: statementA();break; case 2: statementB();break; case 3: case 4: statementC();break; case 5: statementD();break; default: statementF(); 3.1.2 switch選擇結(jié)構(gòu)(續(xù))用switch代替if方法的控制流程13使用switch結(jié)構(gòu)計(jì)算每個(gè)月的天數(shù)static int daysInMonth(int month) int days; sw

11、itch(month) case 2: days = 28; break; case 4: case 6: case 9: case 11: days = 30; break; default: days = 31; return(days); 3.1.2 switch選擇結(jié)構(gòu)(續(xù))例3_2方法的控制流程14用switch語(yǔ)句實(shí)現(xiàn)成績(jī)分類的功能public class Grade public static char gradeLevel(double g)int n = (int)Math.floor(g/10);switch (n) case 10: case 9 : return(A);

12、 case 8 : return(B); case 7 : return(C); case 6 : return(D); default: return(E); 3.1.2 switch選擇結(jié)構(gòu)(續(xù))例3_3方法的控制流程15public static void main(String args) System.out.println(gradeLevel(100)=+gradeLevel(100); System.out.println(gradeLevel(95.5)=+gradeLevel(95.5); System.out.println(gradeLevel(88)=+gradeLe

13、vel(88); System.out.println(gradeLevel(72)=+gradeLevel(72); System.out.println(gradeLevel(68.5)=+gradeLevel(68.5); System.out.println(gradeLevel(60)=+gradeLevel(60); System.out.println(gradeLevel(59.5)=+gradeLevel(59.5); System.out.println(gradeLevel(35)=+gradeLevel(35); 3.1.2 switch選擇結(jié)構(gòu)(續(xù))例3_3方法的控制

14、流程16ex3_3輸入06之間的某一個(gè)整數(shù),然后把它轉(zhuǎn)換成星期 輸出。(0對(duì)應(yīng)星期日)import java.io.*;public class ex3_3 public static void main(String args)throws IOException int day; BufferedReader in =new BufferedReader( new InputStreamReader(System.in); day=(new Integer(in.readLine().intValue();3.1.2 switch選擇結(jié)構(gòu)(續(xù))補(bǔ)充ex3_3.java方法的控制流程17 s

15、witch (day) case 0: System.out.println(Sunday); break; case 1: System.out.println(Monday); break;case 2: System.out.println(Tuesday); break; case 3: System.out.println(Wednesday); break; case 4: System.out.println(Thursday); break; case 5: System.out.println(Friday); break; case 6: System.out.printl

16、n(Saturday); break; default: System.out.println(Day out of range Sunday .Saturday ); break; 3.1.2 switch選擇結(jié)構(gòu)(續(xù))補(bǔ)充ex3_3.java方法的控制流程18for循環(huán)結(jié)構(gòu)是Java三個(gè)循環(huán)語(yǔ)句中功能較強(qiáng)、使用較廣泛的一個(gè)for循環(huán)可以嵌套一般語(yǔ)法格式如下for (start-expression; check-expression; update-expression) /body of the loop; 解釋start-expression完成循環(huán)變量和其他變量的初始化工作check

17、-expression是返回布爾值的條件表達(dá)式,用于判斷循環(huán)是否繼續(xù)update-expression用來(lái)修整循環(huán)變量,改變循環(huán)條件三個(gè)表達(dá)式之間用分號(hào)隔開(kāi)3.1.3 for循環(huán)結(jié)構(gòu)方法的控制流程19For語(yǔ)句的執(zhí)行過(guò)程首先根據(jù)初始表達(dá)式start-expression,完成必要的初始化工作;再判斷表達(dá)式check-expression的值,若為真,則執(zhí)行循環(huán)體執(zhí)行完循環(huán)體后再返回表達(dá)式update-expression,計(jì)算并修改循環(huán)條件,這樣一輪循環(huán)就結(jié)束了第二輪循環(huán)從計(jì)算并判斷表達(dá)式check-expression開(kāi)始,若表達(dá)式的值仍為真,則循環(huán)繼續(xù),否則跳出整個(gè)for語(yǔ)句執(zhí)行for循環(huán)

18、下面的句子3.1.3 for循環(huán)結(jié)構(gòu)(續(xù))方法的控制流程20打印九九乘數(shù)表public class MultiTable public static void main(String args) for (int i=1; i=9;i+) for (int j=1; j=i;j+) System.out.print( +i+*+j+=+i*j); System.out.println(); 3.1.3 for循環(huán)結(jié)構(gòu)(續(xù))方法的控制流程21運(yùn)行結(jié)果如下: 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*

19、2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=813.1.3 for循環(huán)結(jié)構(gòu)(續(xù))運(yùn)行結(jié)果22輸入一個(gè)整數(shù),輸出它所有的因數(shù)import java.io.*;public class ex

20、3_7 public static void main(String args) throws IOException int n,k; BufferedReader in =new BufferedReader( new InputStreamReader(System.in); System.out.println(Enter a positive integer: ); n=(new Integer(in.readLine().intValue(); System.out.print(Number +n+ Factors ); for (k=1; k = n; k+) if (n % k

21、 = 0) System.out.print(k + ); System.out.println(); 3.1.3 for循環(huán)結(jié)構(gòu)(續(xù))補(bǔ)充ex3_7.java方法的控制流程23逗號(hào)運(yùn)算符可用在 for 循環(huán)控制表達(dá)式的初始化和遞增兩部分。在這兩部分中可以存在多個(gè)由逗號(hào)分隔的語(yǔ)句,這些語(yǔ)句會(huì)被依次計(jì)算public class ex3_8 public static void main(String args) for(int i = 1, j = i + 10; i 5; i+, j = i * 2) System.out.println(i= + i + j= + j); 3.1.3 for

22、循環(huán)結(jié)構(gòu)(續(xù))逗號(hào)運(yùn)算符方法的控制流程24while語(yǔ)句實(shí)現(xiàn)“當(dāng)型”循環(huán),其一般語(yǔ)法格式如下:while (check-expression) /body of the loop; 解釋條件表達(dá)式(check-expression)的返回值為布爾型循環(huán)體可以是單個(gè)語(yǔ)句,也可以是復(fù)合語(yǔ)句塊執(zhí)行過(guò)程先判斷check-expression的值,為真則執(zhí)行循環(huán)體循環(huán)體執(zhí)行完后再無(wú)條件轉(zhuǎn)向條件表達(dá)式做計(jì)算與判斷;當(dāng)計(jì)算出條件表達(dá)式的值為假時(shí),跳過(guò)循環(huán)體執(zhí)行while語(yǔ)句后面的語(yǔ)句。若為真,則繼續(xù)執(zhí)行循環(huán)3.1.4 while循環(huán)結(jié)構(gòu)方法的控制流程25循環(huán)接受并輸出從鍵盤(pán)輸入的字符,直到輸入的字符為回車為

23、止char ch=a;while (ch!=n)System.out.println(ch);ch= (char)System.in.read() ; / 接收鍵盤(pán)輸入3.1.4 while循環(huán)結(jié)構(gòu)(續(xù))方法的控制流程26計(jì)算數(shù)列1,2,10 的和。public class ex3_4 public static void main(String args) int i=1, sum=0; while(i=10) sum+=i; i+; System.out.println(sum=+sum); 3.1.4 while循環(huán)結(jié)構(gòu)(續(xù))補(bǔ)充ex3_4.java方法的控制流程27計(jì)算存款收益:假設(shè)銀

24、行中存款10000元,按11.25%的利率,一年后連本帶利將變?yōu)?1125元。你若將此款繼續(xù)存入銀行,試問(wèn)多長(zhǎng)時(shí)間就會(huì)連本帶利翻一番import java.text.*;public class Examp3_4 public static void main(String args) double original,money,interest; int years = 0; original = money= 10000; interest = 11.25 / 100; System.out.println(year money); 3.1.4 while循環(huán)結(jié)構(gòu)(續(xù))例3_4方法的控制流

25、程28 while (money 2 * original) years = years + 1; money = money + (interest * money); System.out.println( + years + + new DecimalFormat(0.00).format(money); System.out.println(); System.out.println( 第 + years + 年存款額達(dá)到 + new DecimalFormat(0.00).format(money) + 元。); 3.1.4 while循環(huán)結(jié)構(gòu)(續(xù))例3_4方法的控制流程29運(yùn)行結(jié)果

26、year money 1 11125.00 2 12376.56 3 13768.93 4 15317.93 5 17041.20 6 18958.33 7 21091.14 第 7 年存款額達(dá)到 21091.14元。3.1.4 while循環(huán)結(jié)構(gòu)(續(xù))例3_4運(yùn)行結(jié)果方法的控制流程30do-while語(yǔ)句實(shí)現(xiàn)“直到型”循環(huán)一般語(yǔ)法結(jié)構(gòu)如下do /body of the loop; while (check-expression);其使用與while語(yǔ)句很類似,不同的是它首先無(wú)條件的執(zhí)行一遍循環(huán)體,再來(lái)判斷條件表達(dá)式的值,若表達(dá)式的值為真,則再運(yùn)行循環(huán)體,否則跳出do-while循環(huán),執(zhí)行下面

27、的語(yǔ)句特點(diǎn):它的循環(huán)體至少要執(zhí)行一次3.1.5 do-while循環(huán)結(jié)構(gòu)方法的控制流程31/while(i=10) sum+=i; i+; System.out.println (sum=+sum);/ do sum+=i; i+; while(i=10); System.out.println (sum=+sum);比較這兩段程序3.1.5 do-while循環(huán)結(jié)構(gòu)(續(xù))方法的控制流程32輸入一個(gè)整數(shù),然后輸出它的翻轉(zhuǎn)形式import java.io.*;public class ex3_5 public static void main(String args)throws IOExcep

28、tion int n, right_digit, newnum = 0; BufferedReader in = new BufferedReader( new InputStreamReader(System.in); System.out.println(Enter the number: ); n=(new Integer(in.readLine().intValue(); System.out.print(The number in reverse order is ); do right_digit = n % 10; System.out.print(right_digit); n

29、 /= 10; while (n != 0); System.out.println(); 3.1.5 do-while循環(huán)結(jié)構(gòu)(續(xù))補(bǔ)充ex3_5.java方法的控制流程33功能跳出循環(huán),不再執(zhí)行剩余部分適用場(chǎng)合在switch 結(jié)構(gòu)中,用來(lái)終止switch語(yǔ)句的執(zhí)行在for循環(huán)及while循環(huán)結(jié)構(gòu)中,用于終止break語(yǔ)句所在的最內(nèi)層循環(huán);與標(biāo)號(hào)一同使用時(shí),將跳出標(biāo)號(hào)所標(biāo)識(shí)的循環(huán)也可用在代碼塊中,用于跳出它所指定的塊3.1.6 break語(yǔ)句方法的控制流程34簡(jiǎn)單break應(yīng)用舉例public class BreakTest public static void main( String a

30、rgs ) String output = ; int i; for ( i = 1; i = 10; i+ ) if ( i = 5 ) break; / break loop only if count = 5 output += i + ; output += nBroke out of loop at i = + i; System.out.println(output); 方法的控制流程3.1.6 break語(yǔ)句(續(xù))例3_535運(yùn)行結(jié)果1 2 3 4Broke out of loop at i = 5解釋執(zhí)行break語(yǔ)句時(shí),程序流程跳出for循環(huán)3.1.6 break語(yǔ)句(續(xù))例

31、3_5運(yùn)行結(jié)果方法的控制流程36在嵌套循環(huán)中使用break語(yǔ)句:使用下面的程序來(lái)實(shí)現(xiàn)例3-4的九九乘法表public class Examp3_6public static void main(String args) for (int i=1; i=9;i+) for (int j=1; j i) break; System.out.print( +i+*+j+=+i*j); System.out.println(); 3.1.6 break語(yǔ)句(續(xù))例3_6方法的控制流程37break與label一同使用舉例public class Examp3_7public static void m

32、ain(String args)outer:for (int i=1; i=9;i+) for (int j=1; j i) break; if (i=6) break outer; System.out.print( +i+*+j+=+i*j); System.out.println(); 3.1.6 break語(yǔ)句(續(xù))例3_7方法的控制流程38運(yùn)行結(jié)果 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25說(shuō)明第一個(gè)break語(yǔ)句跳出內(nèi)層循環(huán)第二個(gè)bre

33、ak outer語(yǔ)句則跳出標(biāo)號(hào)outer所標(biāo)識(shí)的循環(huán),即外重循環(huán)3.1.6 break語(yǔ)句(續(xù))例3_7運(yùn)行結(jié)果方法的控制流程39continue語(yǔ)句必須用于循環(huán)結(jié)構(gòu)中停止本次迭代,回到循環(huán)起始處,開(kāi)始下一次迭代過(guò)程有兩種使用格式不帶標(biāo)號(hào)的continue語(yǔ)句終止當(dāng)前這一輪的循環(huán),跳出本輪循環(huán)剩余的語(yǔ)句,直接進(jìn)入當(dāng)前循環(huán)的下一輪帶標(biāo)號(hào)的continue語(yǔ)句使程序的流程直接轉(zhuǎn)入標(biāo)號(hào)標(biāo)明的循環(huán)層次3.1.7 continue語(yǔ)句方法的控制流程40不帶標(biāo)號(hào)的continue語(yǔ)句在while或do-while循環(huán)中,會(huì)使流程直接跳轉(zhuǎn)至條件表達(dá)式在for循環(huán)中,會(huì)使流程跳轉(zhuǎn)至表達(dá)式update-expr

34、ession,計(jì)算并修改循環(huán)變量后再判斷循環(huán)條件3.1.7 continue語(yǔ)句(續(xù))不帶標(biāo)號(hào)的continue語(yǔ)句方法的控制流程41簡(jiǎn)單的continue語(yǔ)句舉例public class ContinueTestpublic static void main( String args ) String output = ; int i; for ( i = 1; i = 10; i+ ) if ( i = 5 ) continue; / skip remaining code in this loop output += i + ; output += nUsing continue to

35、skip printing 5; output += ni = + i; System.out.println(output); 3.1.7 continue語(yǔ)句(續(xù))例3_8方法的控制流程42運(yùn)行結(jié)果1 2 3 4 6 7 8 9 10Using continue to skip printing 5i = 11說(shuō)明continue語(yǔ)句并沒(méi)有跳出循環(huán)體,而是跳過(guò)本次循環(huán),進(jìn)入下一輪循環(huán)3.1.7 continue語(yǔ)句(續(xù))例3_8運(yùn)行結(jié)果方法的控制流程43打印2到9之間的偶數(shù)的平方,但是不包括偶數(shù)6的平方public class Examp3_9public static void main

36、 (String args) for (int i=2; i=9; i+=2) if (i=6) continue; System.out.println(i*i); 3.1.7 continue語(yǔ)句(續(xù))例3_9方法的控制流程44帶標(biāo)號(hào)的continue語(yǔ)句格式如下continue label;標(biāo)號(hào)label應(yīng)該定義在程序中某一循環(huán)語(yǔ)句前面,用來(lái)標(biāo)志這個(gè)循環(huán)結(jié)構(gòu)3.1.7 continue語(yǔ)句(續(xù))帶標(biāo)號(hào)的continue語(yǔ)句方法的控制流程45九九乘法表也可用下面的程序來(lái)實(shí)現(xiàn)public class Examp3_10public static void main (String args)

37、 outer: for (int i=1; i10; i+) inner: for (int j=1; j10; j+) if (ij) System.out.println(); continue outer; System.out.print( +i+*+j+=+i*j); 當(dāng)執(zhí)行到滿足條件ij時(shí),跳出inner循環(huán),直接跳到outer循環(huán),計(jì)算并修改i的值,進(jìn)行下一輪的循環(huán)3.1.7 continue語(yǔ)句(續(xù))例3_10方法的控制流程46異常處理在進(jìn)行程序設(shè)計(jì)時(shí),錯(cuò)誤的產(chǎn)生是不可避免的。所謂錯(cuò)誤,是在程序運(yùn)行過(guò)程中發(fā)生的異常事件,這些事件的發(fā)生將阻止程序的正常運(yùn)行如何處理錯(cuò)誤?把錯(cuò)誤交給

38、誰(shuí)去處理?程序又該如何從錯(cuò)誤中恢復(fù)?為了加強(qiáng)程序的魯棒性,Java語(yǔ)言具有特定的運(yùn)行錯(cuò)誤處理機(jī)制3.2 異常處理簡(jiǎn)介473.2.1 異常處理的意義異常的基本概念又稱為例外,是特殊的運(yùn)行錯(cuò)誤對(duì)象是面向?qū)ο笠?guī)范的一部分,是異常類的對(duì)象Java中聲明了很多異常類,每個(gè)異常類都代表了一種運(yùn)行錯(cuò)誤,類中包含了該運(yùn)行錯(cuò)誤的信息處理錯(cuò)誤的方法每當(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è)異常異常處理簡(jiǎn)介48java處理錯(cuò)誤的方法拋出(throw)異常在方法的運(yùn)行過(guò)程中,如果發(fā)生了異常,則該方法生成一個(gè)代表該異常的對(duì)象并

39、把它交給運(yùn)行時(shí)系統(tǒng),運(yùn)行時(shí)系統(tǒng)便尋找相應(yīng)的代碼來(lái)處理這一異常捕獲(catch)異常運(yùn)行時(shí)系統(tǒng)在方法的調(diào)用棧中查找,從生成異常的方法開(kāi)始進(jìn)行回溯,直到找到包含相應(yīng)異常處理的方法為止3.2.1 異常處理的意義(續(xù))異常處理簡(jiǎn)介49Method4Method3Method2Method1探測(cè)拋出異常捕獲處理異常調(diào)用3.2.1 異常處理的意義(續(xù))異常處理示意圖異常處理簡(jiǎn)介50Java異常處理機(jī)制的優(yōu)點(diǎn)將錯(cuò)誤處理代碼從常規(guī)代碼中分離出來(lái)按錯(cuò)誤類型和差別分組對(duì)無(wú)法預(yù)測(cè)的錯(cuò)誤的捕獲和處理克服了傳統(tǒng)方法的錯(cuò)誤信息有限的問(wèn)題把錯(cuò)誤傳播給調(diào)用堆棧3.2.1 異常處理的意義(續(xù))異常處理簡(jiǎn)介513.2.2 錯(cuò)誤的

40、概念錯(cuò)誤程序運(yùn)行過(guò)程中發(fā)生的異常事件根據(jù)錯(cuò)誤的嚴(yán)重程度不同,可分為兩類錯(cuò)誤致命性的,用戶程序無(wú)法處理Error類是所有錯(cuò)誤類的父類異常非致命性的,可編制程序捕獲和處理Exception類是所有異常類的父類異常處理簡(jiǎn)介52再對(duì)異常進(jìn)行分類非檢查型異常不能期望程序捕獲的異常(例如數(shù)組越界,除零等)繼承自RuntimeException在方法中不需要聲明,編譯器也不進(jìn)行檢查檢查型異常其他類型的異常如果被調(diào)用的方法拋出一個(gè)類型為E的檢查型異常,那么調(diào)用者必須捕獲E或者也聲明拋出E(或者E的一個(gè)父類),對(duì)此編譯器要進(jìn)行檢查3.2.2 錯(cuò)誤的概念(續(xù))異常處理簡(jiǎn)介533.2.2 錯(cuò)誤的概念(續(xù))異常和錯(cuò)誤

41、類的層次結(jié)構(gòu)異常處理簡(jiǎn)介54Java預(yù)定義的一些常見(jiàn)異常ArithmeticException整數(shù)除法中除數(shù)為0NullPointerException 訪問(wèn)的對(duì)象還沒(méi)有實(shí)例化NegativeArraySizeException 創(chuàng)建數(shù)組時(shí)元素個(gè)數(shù)是負(fù)數(shù)ArrayIndexOutOfBoundsException訪問(wèn)數(shù)組元素時(shí),數(shù)組下標(biāo)越界ArrayStoreException程序試圖向數(shù)組中存取錯(cuò)誤類型的數(shù)據(jù)FileNotFoundException試圖存取一個(gè)并不存在的文件IOException通常的I/O錯(cuò)誤3.2.2 錯(cuò)誤的概念(續(xù))預(yù)定義的一些常見(jiàn)異常異常處理簡(jiǎn)介非檢查型異常檢查型異

42、常55測(cè)試系統(tǒng)定義的運(yùn)行異常數(shù)組越界出現(xiàn)的異常import java.io.*;public class HelloWorld public static void main (String args ) int i = 0;String greetings = Hello world!, No, I mean it!, HELLO WORLD!;while (i 4) System.out.println (greetingsi); i+;3.2.2 錯(cuò)誤的概念(續(xù))例3_11異常處理簡(jiǎn)介56運(yùn)行結(jié)果Hello world!No, I mean it!HELLO WORLD!Exceptio

43、n in thread main java.lang.ArrayIndexOutOfBoundsException at HelloWorld.main(HelloWorld.java:7)說(shuō)明訪問(wèn)數(shù)組下標(biāo)越界,導(dǎo)致ArrayIndexOutOfBoundsException異常該異常是系統(tǒng)定義好的類,對(duì)應(yīng)系統(tǒng)可識(shí)別的錯(cuò)誤,所以Java虛擬會(huì)自動(dòng)中止程序的執(zhí)行流程,并新建一個(gè)該異常類的對(duì)象,即拋出數(shù)組出界異常3.2.2 錯(cuò)誤的概念(續(xù))例3_11運(yùn)行結(jié)果異常處理簡(jiǎn)介573.2.3 異常的處理對(duì)于檢查型異常,Java強(qiáng)迫程序必須進(jìn)行處理。處理方法有兩種:聲明拋出異常不在當(dāng)前方法內(nèi)處理異常,而是把

44、異常拋出到調(diào)用方法中捕獲異常使用trycatch()塊,捕獲到所發(fā)生的異常,并進(jìn)行相應(yīng)的處理異常處理簡(jiǎn)介58聲明拋出異常如果程序員不想在當(dāng)前方法內(nèi)處理異常,可以使用throws子句聲明將異常拋出到調(diào)用方法中如果所有的方法都選擇了拋出此異常,最后 JVM將捕獲它,輸出相關(guān)的錯(cuò)誤信息,并終止程序的運(yùn)行。在異常被拋出的過(guò)程中, 任何方法都可以捕獲它并進(jìn)行相應(yīng)的處理3.2.3 異常的處理(續(xù))聲明拋出異常異常處理簡(jiǎn)介593.2.3 異常的處理(續(xù))一個(gè)例子public void openThisFile(String fileName) throws java.io.FileNotFoundExcep

45、tion /code for method public void getCustomerInfo() throws java.io.FileNotFoundException / do something this.openThisFile(customer.txt); / do something 如果在openThisFile中拋出了FileNotfoundException異常,getCustomerInfo將停止執(zhí)行,并將此異常傳送給它的調(diào)用者異常處理簡(jiǎn)介60語(yǔ)法格式try statement(s) catch (exceptiontype name) statement(s) fi

46、nally statement(s)3.2.3 異常的處理(續(xù))捕獲異常異常處理簡(jiǎn)介61說(shuō)明try 語(yǔ)句 其后跟隨可能產(chǎn)生異常的代碼塊catch語(yǔ)句其后跟隨異常處理語(yǔ)句,通常用到兩個(gè)方法getMessage() 返回一個(gè)字符串對(duì)發(fā)生的異常進(jìn)行描述。 printStackTrace() 給出方法的調(diào)用序列,一直到異常的產(chǎn)生位置 finally語(yǔ)句不論在try代碼段是否產(chǎn)生異常,finally 后的程序代碼段都會(huì)被執(zhí)行。通常在這里釋放內(nèi)存以外的其他資源注意事項(xiàng)在類層次樹(shù)中,一般的異常類型放在后面,特殊的放在前面3.2.3 異常的處理(續(xù))捕獲異常異常處理簡(jiǎn)介62讀入兩個(gè)整數(shù),第一個(gè)數(shù)除以第二個(gè)數(shù),

47、之后輸出import java.io.*; public class ExceptionTester public static void main(String args) System.out.println(Enter the first number:); int number1 = Keyboard.getInteger(); System.out.println(Enter the second number:); int number2 = Keyboard.getInteger(); System.out.print(number1 + / + number2 + =); in

48、t result = number1 / number2; System.out.println(result); 3.2.3 異常的處理(續(xù))例3_12異常處理簡(jiǎn)介63其中,Keyboard類的聲明如下import java.io.*; public class Keyboardstatic BufferedReader inputStream = new BufferedReader (new InputStreamReader(System.in); public static int getInteger() try return (Integer.valueOf(inputStrea

49、m.readLine().trim().intValue(); catch (Exception e) e.printStackTrace(); return 0; public static String getString() try return (inputStream.readLine(); catch (IOException e) return 0; 3.2.3 異常的處理(續(xù))例3_12異常處理簡(jiǎn)介64運(yùn)行結(jié)果Enter the first number:140Enter the second number:abcjava.lang.NumberFormatException:

50、 abc at java.lang.Integer.parseInt(Integer.java:426) at java.lang.Integer.valueOf(Integer.java:532) at Keyboard.getInteger(Keyboard.java:10) at ExceptionTester.main(ExceptionTester.java:7)140 / 0=Exception in thread main java.lang.ArithmeticException: / by zero at ExceptionTester.main(ExceptionTeste

51、r.java:10)3.2.3 異常的處理(續(xù))例3_12運(yùn)行結(jié)果異常處理簡(jiǎn)介65捕獲 NumberFormatException類型的異常import java.io.*; public class ExceptionTester2 public static void main(String args) int number1=0, number2=0; try System.out.println(Enter the first number:); number1 = Integer.valueOf(Keyboard.getString().intValue(); System.out.

52、println(Enter the second number:); number2 = Integer.valueOf(Keyboard.getString().intValue(); catch (NumberFormatException e) System.out.println(Those were not proper integers! I quit!); System.exit(-1); System.out.print(number1 + / + number2 + =); int result = number1 / number2; System.out.println(

53、result); 異常處理簡(jiǎn)介3.2.3 異常的處理(續(xù))例3_1366運(yùn)行結(jié)果Enter the first number:abcThose were not proper integers! I quit!異常處理簡(jiǎn)介3.2.3 異常的處理(續(xù))例3_13運(yùn)行結(jié)果67捕獲被零除的異常 ( ArithmeticException類型的異常)try System.out.println(Enter the first number:); number1 = Integer.valueOf(Keyboard.getString().intValue(); System.out.println(E

54、nter the second number:); number2 = Integer.valueOf(Keyboard.getString().intValue(); result = number1 / number2; catch (NumberFormatException e) System.out.println(Invalid integer entered!); System.exit(-1); catch (ArithmeticException e) System.out.println(Second number is 0, cannot do division!); S

55、ystem.exit(-1); 異常處理簡(jiǎn)介3.2.3 異常的處理(續(xù))例3_1468運(yùn)行結(jié)果Enter the first number:143Enter the second number:0Second number is 0, cannot do division!異常處理簡(jiǎn)介3.2.3 異常的處理(續(xù))例3_14運(yùn)行結(jié)果69對(duì)程序進(jìn)行改進(jìn):重復(fù)提示輸入,直到輸入合法的數(shù)據(jù)。為了避免代碼重復(fù),可將數(shù)據(jù)存入數(shù)組import java.io.*; public class ExceptionTester4 public static void main(String args) int r

56、esult; int number = new int2; boolean valid; for (int i=0; i2; i+) valid = false; while (!valid) try System.out.println(Enter number +(i+1); numberi=Integer.valueOf(Keyboard.getString().intValue(); valid = true; catch (NumberFormatException e) System.out.println(Invalid integer entered. Please tryag

57、ain.); 異常處理簡(jiǎn)介3.2.3 異常的處理(續(xù))例3_14改進(jìn)70 try result = number0 / number1; System.out.print(number0 + / + number1 + = + result); catch (ArithmeticException e) System.out.println(Second number is 0, cannot do division!); 3.2.3 異常的處理(續(xù))例3_14改進(jìn)71運(yùn)行結(jié)果Enter number 1abcInvalid integer entered. Please try again.

58、Enter number 1efgInvalid integer entered. Please try again.Enter number 1143Enter number 2abcInvalid integer entered. Please try again.Enter number 240143 / 40=33.2.3 異常的處理(續(xù))例3_14運(yùn)行結(jié)果723.2.4 生成異常對(duì)象生成異常對(duì)象三種方式由Java虛擬機(jī)生成由Java類庫(kù)中的某些類生成在程序中生成自己的異常對(duì)象,也即是異??梢圆皇浅鲥e(cuò)產(chǎn)生,而是人為地拋出生成異常對(duì)象都是通過(guò)throw語(yǔ)句實(shí)現(xiàn),生成的異常對(duì)象必須是Thr

59、owable或其子類的實(shí)例throw new ThrowableObject();ArithmeticException e = new ArithmeticException(); throw e;73生成異常對(duì)象舉例class ThrowTest public static void main(String args) try throw new ArithmeticException(); catch(ArithmeticException ae) System.out.println(ae); try throw new ArrayIndexOutOfBoundsException()

60、; catch(ArrayIndexOutOfBoundsException ai) System.out.println(ai); try throw new StringIndexOutOfBoundsException(); catch(StringIndexOutOfBoundsException si) System.out.println(si); 3.2.4 生成異常對(duì)象(續(xù))例3_1674運(yùn)行結(jié)果java.lang.ArithmeticExceptionjava.lang.ArrayIndexOutOfBoundsExceptionjava.lang.StringIndexOu

溫馨提示

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

評(píng)論

0/150

提交評(píng)論