《Java学习-第3章-类的方法-异常推荐课件》由会员分享,可在线阅读,更多相关《Java学习-第3章-类的方法-异常推荐课件(84页珍藏版)》请在金锄头文库上搜索。
1、第三章第三章 类的方法类的方法郑郑 莉莉JAVA语言程序设计2021/8/221JAVA语言程序设计清华大学 郑莉目录目录l3.1 方法的控制流程方法的控制流程l3.2 异常处理简介异常处理简介l3.3 方法的重载方法的重载(overloading)l3.4 本章小结本章小结2021/8/222JAVA语言程序设计清华大学 郑莉3.1 方法的控制流程方法的控制流程l方法的控制流程方法的控制流程Java程序通过控制语句来控制方法的执行流程Java中的流程控制结构主要有三种l顺序结构l选择结构if语句(二路选择结构)switch语句(多路选择结构)l循环结构for语句while语句do-while
2、语句2021/8/223JAVA语言程序设计清华大学 郑莉3.1.1 if选择结构选择结构l语法形式语法形式只有if分支,没有else分支if (boolean-expression) / statement1; if-else语句if (boolean-expression) / statement1 ; else / statement2 ; 方法的控制流程2021/8/224JAVA语言程序设计清华大学 郑莉3.1.1 if选择结构选择结构(续续)if-else语句的特殊形式if (boolean expression) /statement1;else if (boolean expr
3、ession) /statement2; else if (boolean expression) /statement; else /statement; 方法的控制流程2021/8/225JAVA语言程序设计清华大学 郑莉lex3_1 输入一个年份,判断它是不是闰年。闰年: 能被4整除但不能被100整除,或者能被400整除。public class ex3_1 public static void main(String args) throws IOException int year; boolean IsLeapYear; System.out.println(Enter the y
4、ear:); BufferedReader in =new BufferedReader( new InputStreamReader(System.in); year=(new Integer(in.readLine().intValue(); 3.1.1 if选择结构选择结构(续续)ex3_1.java方法的控制流程2021/8/226JAVA语言程序设计清华大学 郑莉 IsLeapYear=(year%4=0 & year%100 != 0)|(year%400 = 0); if (IsLeapYear) System.out.print(year); System.out.printl
5、n( is a leap year); else System.out.print(year); System.out.println( is not a leap year); 3.1.1 if选择结构选择结构(续续)ex3_1.java方法的控制流程2021/8/227JAVA语言程序设计清华大学 郑莉l输入两个整数比较大小输入两个整数比较大小import java.io.*;public class ex3_2 public static void main(String args)throws IOException int x,y; BufferedReader in = new B
6、ufferedReader( 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: +a);else System.out.print
7、ln(The larger one is: +b);l用条件运算符重写用条件运算符重写: System.out.println(The larger one is: + (ab)?a:b);3.1.1 if选择结构选择结构(续续)以条件运算符代替以条件运算符代替if_else方法的控制流程2021/8/229JAVA语言程序设计清华大学 郑莉l计算每个月的天数计算每个月的天数static int daysInMonth(int month) if (month = 2) return(28); else if (month=4)|(month=6)|(month=9)|(month=11) r
8、eturn(30); else return(31); 方法的控制流程3.1.1 if选择结构选择结构(续续)例例3_12021/8/2210JAVA语言程序设计清华大学 郑莉l已知一个学生的分数,给出其分数等级。已知一个学生的分数,给出其分数等级。90-100分为级;分为级;80-89分为分为B级;级;70-79分为级;分为级;60-69分为分为D级;级;0-59分为分为E级级public class IfElseDemo public static void main(String args) int testscore = 76; char grade; if (testscore =
9、90) grade = A; else if (testscore = 80) grade = B; else if (testscore = 70) grade = C; else if (testscore = 60) grade = D; else grade = F; System.out.println(Grade = + grade); 程序输出:程序输出:Grade = C3.1.1 if选择结构选择结构(续续)ifElseDemo.java方法的控制流程2021/8/2211JAVA语言程序设计清华大学 郑莉3.1.2 switch选择结构选择结构lswitch语句是多分支的选
10、择结构语句是多分支的选择结构switch (switch-expression) case value1: statements for case1; break; case value2: statements for case2; break; . case valueN: statements for caseN; break; default: statements for default case; break; l注意问题注意问题switch-expression、常量值value1到valueN必须是整形或字符型如果表达式的值和某个case后面的值相同,则从该case之后开始执行
11、,直到break语句为止default是可有可无的,若没有一个常量与表达式的值相同,则从default之后开始执行方法的控制流程2021/8/2212JAVA语言程序设计清华大学 郑莉if(i=1)statementA();elseif(i=2)statementB();elseif(i=3)|(i=4)statementC();elseif(i=5)statementD();elsestatementF(); switch(i) case1:statementA();break;case2:statementB();break;case3:case4:statementC();break;c
12、ase5:statementD();break;default:statementF();3.1.2 switch选择结构选择结构(续续)用用switch代替代替if方法的控制流程2021/8/2213JAVA语言程序设计清华大学 郑莉l使用使用switch结构计算每个月的天数结构计算每个月的天数static int daysInMonth(int month) int days; switch(month) case 2: days = 28; break; case 4: case 6: case 9: case 11: days = 30; break; default: days =
13、31; return(days); 3.1.2 switch选择结构选择结构(续续)例例3_2方法的控制流程2021/8/2214JAVA语言程序设计清华大学 郑莉l用用switch语句实现成绩分类的功能语句实现成绩分类的功能public class Grade public static char gradeLevel(double g)int n = (int)Math.floor(g/10);switch (n) case 10: case 9 : return(A); case 8 : return(B); case 7 : return(C); case 6 : return(D);
14、 default: return(E); 3.1.2 switch选择结构选择结构(续续)例例3_3方法的控制流程2021/8/2215JAVA语言程序设计清华大学 郑莉public 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)=+gradeLevel(88); System.out.println(
15、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选择结构选择结构(续续)例例3_3方法的控制流程2021/8/2216JAVA语言程序设
16、计清华大学 郑莉lex3_3输入06之间的某一个整数,然后把它转换成星期 输出。(0对应星期日)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选择结构选择结构(续续)补充补充ex3_3.jav
17、a方法的控制流程2021/8/2217JAVA语言程序设计清华大学 郑莉 switch (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(Fri
18、day); break; case 6: System.out.println(Saturday); break; default: System.out.println(Day out of range Sunday .Saturday ); break; 3.1.2 switch选择结构选择结构(续续)补充补充ex3_3.java方法的控制流程2021/8/2218JAVA语言程序设计清华大学 郑莉lfor循环结构循环结构是Java三个循环语句中功能较强、使用较广泛的一个for循环可以嵌套一般语法格式如下for (start-expression; check-expression; up
19、date-expression) /body of the loop; 解释lstart-expression完成循环变量和其他变量的初始化工作lcheck-expression是返回布尔值的条件表达式,用于判断循环是否继续lupdate-expression用来修整循环变量,改变循环条件l三个表达式之间用分号隔开3.1.3 for循环结构循环结构方法的控制流程2021/8/2219JAVA语言程序设计清华大学 郑莉lFor语句的执行过程语句的执行过程首先根据初始表达式start-expression,完成必要的初始化工作;再判断表达式check-expression的值,若为真,则执行循环体
20、执行完循环体后再返回表达式update-expression,计算并修改循环条件,这样一轮循环就结束了第二轮循环从计算并判断表达式check-expression开始,若表达式的值仍为真,则循环继续,否则跳出整个for语句执行for循环下面的句子3.1.3 for循环结构循环结构(续续)方法的控制流程2021/8/2220JAVA语言程序设计清华大学 郑莉l打印九九乘数表打印九九乘数表public class MultiTable public static void main(String args) for (int i=1; i=9;i+) for (int j=1; j=i;j+) S
21、ystem.out.print( +i+*+j+=+i*j); System.out.println(); 3.1.3 for循环结构循环结构(续续)方法的控制流程2021/8/2221JAVA语言程序设计清华大学 郑莉l运行结果如下:运行结果如下: 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 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
22、=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循环结构循环结构(续续)运行结果运行结果2021/8/2222JAVA语言程序设计清华大学 郑莉l输入一个整数,输出它所有的因数输入一个整数,输出它所有的因数import java.io.*;public class ex3_7 public static void main(String args) throws IOExc
23、eption 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 = 0) System.out.print(k + ); System.out.println(); 3
24、.1.3 for循环结构循环结构(续续)补充补充ex3_7.java方法的控制流程2021/8/2223JAVA语言程序设计清华大学 郑莉l逗号运算符逗号运算符可用在 for 循环控制表达式的初始化和递增两部分。在这两部分中可以存在多个由逗号分隔的语句,这些语句会被依次计算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循环结构循环结构(续续)逗号
25、运算符逗号运算符方法的控制流程2021/8/2224JAVA语言程序设计清华大学 郑莉lwhile语句语句实现“当型”循环,其一般语法格式如下:while (check-expression) /body of the loop; 解释l条件表达式(check-expression)的返回值为布尔型l循环体可以是单个语句,也可以是复合语句块执行过程l先判断check-expression的值,为真则执行循环体l循环体执行完后再无条件转向条件表达式做计算与判断;当计算出条件表达式的值为假时,跳过循环体执行while语句后面的语句。若为真,则继续执行循环3.1.4 while循环结构循环结构方法的
26、控制流程2021/8/2225JAVA语言程序设计清华大学 郑莉l循环接受并输出从键盘输入的字符,直到循环接受并输出从键盘输入的字符,直到输入的字符为回车为止输入的字符为回车为止char ch=a;while (ch!=n)System.out.println(ch);ch= (char)System.in.read() ; / 接收键盘输入3.1.4 while循环结构循环结构(续续)方法的控制流程2021/8/2226JAVA语言程序设计清华大学 郑莉l计算数列计算数列1,2,10 的和。的和。public class ex3_4 public static void main(Strin
27、g args) int i=1, sum=0; while(i=10) sum+=i; i+; System.out.println(sum=+sum); 3.1.4 while循环结构循环结构(续续)补充补充ex3_4.java方法的控制流程2021/8/2227JAVA语言程序设计清华大学 郑莉l计算存款收益:假设银行中存款计算存款收益:假设银行中存款10000元,按元,按11.25%的利率,的利率,一年后连本带利将变为一年后连本带利将变为11125元。你若将此款继续存入银行,元。你若将此款继续存入银行,试问多长时间就会连本带利翻一番试问多长时间就会连本带利翻一番import java.t
28、ext.*;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循环结构循环结构(续续)例例3_4方法的控制流程2021/8/2228JAVA语言程序设计清华大学 郑莉 while (money 2 * original) years = years +
29、1; money = money + (interest * money); System.out.println( + years + + new DecimalFormat(0.00).format(money); System.out.println(); System.out.println( 第 + years + 年存款额达到 + new DecimalFormat(0.00).format(money) + 元。); 3.1.4 while循环结构循环结构(续续)例例3_4方法的控制流程2021/8/2229JAVA语言程序设计清华大学 郑莉l运行结果运行结果year money
30、 1 11125.00 2 12376.56 3 13768.93 4 15317.93 5 17041.20 6 18958.33 7 21091.14 第 7 年存款额达到 21091.14元。3.1.4 while循环结构循环结构(续续)例例3_4运行结果运行结果方法的控制流程2021/8/2230JAVA语言程序设计清华大学 郑莉ldo-while语句语句实现“直到型”循环一般语法结构如下do /body of the loop; while (check-expression);其使用与while语句很类似,不同的是它首先无条件的执行一遍循环体,再来判断条件表达式的值,若表达式的值为
31、真,则再运行循环体,否则跳出do-while循环,执行下面的语句特点:它的循环体至少要执行一次3.1.5 do-while循环结构循环结构方法的控制流程2021/8/2231JAVA语言程序设计清华大学 郑莉/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循环结构循环结构(续续)方法的控制流程2021/8/2232JAVA语言程序设计清华大学 郑莉l输入一个整
32、数,然后输出它的翻转形式输入一个整数,然后输出它的翻转形式import java.io.*;public class ex3_5 public static void main(String args)throws IOException 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().intVa
33、lue(); System.out.print(The number in reverse order is ); do right_digit = n % 10; System.out.print(right_digit); n /= 10; while (n != 0); System.out.println(); 3.1.5 do-while循环结构循环结构(续续)补充补充ex3_5.java方法的控制流程2021/8/2233JAVA语言程序设计清华大学 郑莉l功能功能跳出循环,不再执行剩余部分l适用场合适用场合在switch 结构中,用来终止switch语句的执行在for循环及whi
34、le循环结构中,用于终止break语句所在的最内层循环;与标号一同使用时,将跳出标号所标识的循环也可用在代码块中,用于跳出它所指定的块3.1.6 break语句语句方法的控制流程2021/8/2234JAVA语言程序设计清华大学 郑莉l简单简单break应用举例应用举例public class BreakTest public static void main( String args ) String output = ; int i; for ( i = 1; i = 10; i+ ) if ( i = 5 ) break; / break loop only if count = 5 o
35、utput += i + ; output += nBroke out of loop at i = + i; System.out.println(output); 方法的控制流程3.1.6 break语句语句(续续)例例3_52021/8/2235JAVA语言程序设计清华大学 郑莉l运行结果运行结果1 2 3 4Broke out of loop at i = 5l解释解释执行break语句时,程序流程跳出for循环3.1.6 break语句语句(续续)例例3_5运行结果运行结果方法的控制流程2021/8/2236JAVA语言程序设计清华大学 郑莉l在嵌套循环中使用在嵌套循环中使用brea
36、k语句:使用下面的程序来语句:使用下面的程序来实现例实现例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语句语句(续续)例例3_6方法的控制流程2021/8/2237JAVA语言程序设计清华大学 郑莉lbreak与与label一同使用举例一同使用举例public clas
37、s Examp3_7public static void main(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语句语句(续续)例例3_7方法的控制流程2021/8/2238JAVA语言程序设计清华大学 郑莉l运行结果运行结果 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
38、 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25l说明说明第一个break语句跳出内层循环第二个break outer语句则跳出标号outer所标识的循环,即外重循环3.1.6 break语句语句(续续)例例3_7运行结果运行结果方法的控制流程2021/8/2239JAVA语言程序设计清华大学 郑莉lcontinue语句语句必须用于循环结构中停止本次迭代,回到循环起始处,开始下一次迭代过程有两种使用格式l不带标号的continue语句终止当前这一轮的循环,跳出本轮循环剩余的语句,直接进入当前循环的下一轮l带标号的continue语句使程序的流程直接转入标号标明
39、的循环层次3.1.7 continue语句语句方法的控制流程2021/8/2240JAVA语言程序设计清华大学 郑莉l不带标号的不带标号的continue语句语句在while或do-while循环中,会使流程直接跳转至条件表达式在for循环中,会使流程跳转至表达式update-expression,计算并修改循环变量后再判断循环条件3.1.7 continue语句语句(续续)不带标号的不带标号的continue语句语句方法的控制流程2021/8/2241JAVA语言程序设计清华大学 郑莉l简单的简单的continue语句举例语句举例public class ContinueTestpublic
40、 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 skip printing 5; output += ni = + i; System.out.println(output); 3.1.7 continue语句语句(续续)例例3_8方法的控制流程2021/8/2242JAV
41、A语言程序设计清华大学 郑莉l运行结果运行结果1 2 3 4 6 7 8 9 10Using continue to skip printing 5i = 11l说明说明continue语句并没有跳出循环体,而是跳过本次循环,进入下一轮循环3.1.7 continue语句语句(续续)例例3_8运行结果运行结果方法的控制流程2021/8/2243JAVA语言程序设计清华大学 郑莉l打印打印2到到9之间的偶数的平方,但是不包括之间的偶数的平方,但是不包括偶数偶数6的平方的平方public class Examp3_9public static void main (String args) for
42、 (int i=2; i=9; i+=2) if (i=6) continue; System.out.println(i*i); 3.1.7 continue语句语句(续续)例例3_9方法的控制流程2021/8/2244JAVA语言程序设计清华大学 郑莉l带标号的带标号的continue语句语句格式如下continue label;标号label应该定义在程序中某一循环语句前面,用来标志这个循环结构3.1.7 continue语句语句(续续)带标号的带标号的continue语句语句方法的控制流程2021/8/2245JAVA语言程序设计清华大学 郑莉l九九乘法表也可用下面的程序来实现九九乘法
43、表也可用下面的程序来实现public class Examp3_10public static void main (String args) 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); l当执行到满足条件当执行到满足条件ij时,跳出时,跳出inner循环,直接跳到循环,直接跳到outer循环,计算并修改循环,计算并修改i的值,进行下一轮的循环的值,进行下一轮的循
44、环3.1.7 continue语句语句(续续)例例3_10方法的控制流程2021/8/2246JAVA语言程序设计清华大学 郑莉l异常处理异常处理在进行程序设计时,错误的产生是不可避免的。所谓错误,是在程序运行过程中发生的异常事件,这些事件的发生将阻止程序的正常运行如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?为了加强程序的鲁棒性,Java语言具有特定的运行错误处理机制3.2 异常处理简介异常处理简介2021/8/2247JAVA语言程序设计清华大学 郑莉3.2.1 异常处理的意义异常处理的意义l异常的基本概念异常的基本概念又称为例外,是特殊的运行错误对象是面向对象规范的一部分,
45、是异常类的对象Java中声明了很多异常类,每个异常类都代表了一种运行错误,类中包含了l该运行错误的信息l处理错误的方法每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常异常处理简介2021/8/2248JAVA语言程序设计清华大学 郑莉ljava处理错误的方法处理错误的方法抛出(throw)异常l在方法的运行过程中,如果发生了异常,则该方法生成一个代表该异常的对象并把它交给运行时系统,运行时系统便寻找相应的代码来处理这一异常捕获(catch)异常l运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回
46、溯,直到找到包含相应异常处理的方法为止3.2.1 异常处理的意义异常处理的意义(续续)异常处理简介2021/8/2249JAVA语言程序设计清华大学 郑莉Method4Method3Method2Method1探测抛出异常捕获处理异常调用3.2.1 异常处理的意义异常处理的意义(续续)异常处理示意图异常处理示意图异常处理简介2021/8/2250JAVA语言程序设计清华大学 郑莉lJava异常处理机制的优点异常处理机制的优点将错误处理代码从常规代码中分离出来按错误类型和差别分组对无法预测的错误的捕获和处理克服了传统方法的错误信息有限的问题把错误传播给调用堆栈3.2.1 异常处理的意义异常处理的
47、意义(续续)异常处理简介2021/8/2251JAVA语言程序设计清华大学 郑莉3.2.2 错误的概念错误的概念l错误错误程序运行过程中发生的异常事件根据错误的严重程度不同,可分为两类l错误致命性的,用户程序无法处理Error类是所有错误类的父类l异常非致命性的,可编制程序捕获和处理Exception类是所有异常类的父类异常处理简介2021/8/2252JAVA语言程序设计清华大学 郑莉l再对异常进行分类再对异常进行分类非检查型异常l不能期望程序捕获的异常(例如数组越界,除零等)l继承自RuntimeExceptionl在方法中不需要声明,编译器也不进行检查检查型异常l其他类型的异常l如果被调
48、用的方法抛出一个类型为E的检查型异常,那么调用者必须捕获E或者也声明抛出E(或者E的一个父类),对此编译器要进行检查3.2.2 错误的概念错误的概念(续续)异常处理简介2021/8/2253JAVA语言程序设计清华大学 郑莉3.2.2 错误的概念错误的概念(续续)异常和错误类的层次结构异常和错误类的层次结构异常处理简介2021/8/2254JAVA语言程序设计清华大学 郑莉lJava预定义的一些常见异常预定义的一些常见异常ArithmeticExceptionl整数除法中除数为0NullPointerException l访问的对象还没有实例化NegativeArraySizeExceptio
49、n l创建数组时元素个数是负数ArrayIndexOutOfBoundsExceptionl访问数组元素时,数组下标越界ArrayStoreExceptionl程序试图向数组中存取错误类型的数据FileNotFoundExceptionl试图存取一个并不存在的文件IOExceptionl通常的I/O错误3.2.2 错误的概念错误的概念(续续)预定义的一些常见异常预定义的一些常见异常异常处理简介非检查型异常检查型异常2021/8/2255JAVA语言程序设计清华大学 郑莉l测试系统定义的运行异常测试系统定义的运行异常数组越界出数组越界出现的异常现的异常import java.io.*;publi
50、c 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 错误的概念错误的概念(续续)例例3_11异常处理简介2021/8/2256JAVA语言程序设计清华大学 郑莉l运行结果运行结果Hello world!No, I mean it!HELLO WORLD!Exception in th
51、read main java.lang.ArrayIndexOutOfBoundsException at HelloWorld.main(HelloWorld.java:7)l说明说明访问数组下标越界,导致ArrayIndexOutOfBoundsException异常该异常是系统定义好的类,对应系统可识别的错误,所以Java虚拟会自动中止程序的执行流程,并新建一个该异常类的对象,即抛出数组出界异常3.2.2 错误的概念错误的概念(续续)例例3_11运行结果运行结果异常处理简介2021/8/2257JAVA语言程序设计清华大学 郑莉3.2.3 异常的处理异常的处理l对于检查型异常,对于检查型
52、异常,Java强迫程序必须强迫程序必须进行处理。处理方法有两种:进行处理。处理方法有两种:声明抛出异常l不在当前方法内处理异常,而是把异常抛出到调用方法中捕获异常l使用trycatch()块,捕获到所发生的异常,并进行相应的处理异常处理简介2021/8/2258JAVA语言程序设计清华大学 郑莉l声明抛出异常声明抛出异常如果程序员不想在当前方法内处理异常,可以使用throws子句声明将异常抛出到调用方法中如果所有的方法都选择了抛出此异常,最后 JVM将捕获它,输出相关的错误信息,并终止程序的运行。在异常被抛出的过程中, 任何方法都可以捕获它并进行相应的处理3.2.3 异常的处理异常的处理(续续
53、)声明抛出异常声明抛出异常异常处理简介2021/8/2259JAVA语言程序设计清华大学 郑莉3.2.3 异常的处理异常的处理(续续)一个例子一个例子public void openThisFile(String fileName) throws java.io.FileNotFoundException /code for method public void getCustomerInfo() throws java.io.FileNotFoundException / do something this.openThisFile(customer.txt); / do something
54、 l如果在如果在openThisFile中抛出了中抛出了FileNotfoundException异常,异常,getCustomerInfo将停止执行,并将此异常传送给它的将停止执行,并将此异常传送给它的调用者调用者异常处理简介2021/8/2260JAVA语言程序设计清华大学 郑莉l语法格式语法格式try statement(s) catch (exceptiontype name) statement(s) finally statement(s)3.2.3 异常的处理异常的处理(续续)捕获异常捕获异常异常处理简介2021/8/2261JAVA语言程序设计清华大学 郑莉l说明说明try 语
55、句 l其后跟随可能产生异常的代码块catch语句l其后跟随异常处理语句,通常用到两个方法getMessage() 返回一个字符串对发生的异常进行描述。 printStackTrace() 给出方法的调用序列,一直到异常的产生位置 finally语句l不论在try代码段是否产生异常,finally 后的程序代码段都会被执行。通常在这里释放内存以外的其他资源l注意事项注意事项在类层次树中,一般的异常类型放在后面,特殊的放在前面3.2.3 异常的处理异常的处理(续续)捕获异常捕获异常异常处理简介2021/8/2262JAVA语言程序设计清华大学 郑莉l读入两个整数,第一个数除以第二个数,之后输出读入
56、两个整数,第一个数除以第二个数,之后输出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 + / +
57、number2 + =); int result = number1 / number2; System.out.println(result); 3.2.3 异常的处理异常的处理(续续)例例3_12异常处理简介2021/8/2263JAVA语言程序设计清华大学 郑莉l其中,其中,Keyboard类的声明如下类的声明如下import java.io.*; public class Keyboardstatic BufferedReader inputStream = new BufferedReader (new InputStreamReader(System.in); public sta
58、tic int getInteger() try return (Integer.valueOf(inputStream.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 异常的处理异常的处理(续续)例例3_12异常处理简介2021/8/2264JAVA语言程序设计清华大学
59、 郑莉l运行结果运行结果Enter the first number:140Enter the second number:abcjava.lang.NumberFormatException: 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=Excepti
60、on in thread main java.lang.ArithmeticException: / by zero at ExceptionTester.main(ExceptionTester.java:10)3.2.3 异常的处理异常的处理(续续)例例3_12运行结果运行结果异常处理简介2021/8/2265JAVA语言程序设计清华大学 郑莉l捕获捕获 NumberFormatException类型的异常类型的异常import java.io.*; public class ExceptionTester2 public static void main(String args) int
61、 number1=0, number2=0; try System.out.println(Enter the first number:); number1 = Integer.valueOf(Keyboard.getString().intValue(); System.out.println(Enter the second number:); number2 = Integer.valueOf(Keyboard.getString().intValue(); catch (NumberFormatException e) System.out.println(Those were no
62、t proper integers! I quit!); System.exit(-1); System.out.print(number1 + / + number2 + =); int result = number1 / number2; System.out.println(result); 异常处理简介3.2.3 异常的处理异常的处理(续续)例例3_132021/8/2266JAVA语言程序设计清华大学 郑莉l运行结果运行结果Enter the first number:abcThose were not proper integers! I quit!异常处理简介3.2.3 异常的
63、处理异常的处理(续续)例例3_13运行结果运行结果2021/8/2267JAVA语言程序设计清华大学 郑莉l捕获被零除的异常捕获被零除的异常 ( ArithmeticException类型的异常类型的异常)try System.out.println(Enter the first number:); number1 = Integer.valueOf(Keyboard.getString().intValue(); System.out.println(Enter the second number:); number2 = Integer.valueOf(Keyboard.getStrin
64、g().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!); System.exit(-1); 异常处理简介3.2.3 异常的处理异常的处理(续续)例例3_142021/8/2268JAVA语言程序设计
65、清华大学 郑莉l运行结果运行结果Enter the first number:143Enter the second number:0Second number is 0, cannot do division!异常处理简介3.2.3 异常的处理异常的处理(续续)例例3_14运行结果运行结果2021/8/2269JAVA语言程序设计清华大学 郑莉l对程序进行改进:重复提示输入,直到输入合法的数据。为对程序进行改进:重复提示输入,直到输入合法的数据。为了避免代码重复,可将数据存入数组了避免代码重复,可将数据存入数组import java.io.*; public class ExceptionT
66、ester4 public static void main(String args) int result; 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.
67、out.println(Invalid integer entered. Please tryagain.); 异常处理简介3.2.3 异常的处理异常的处理(续续)例例3_14改进改进2021/8/2270JAVA语言程序设计清华大学 郑莉 try result = number0 / number1; System.out.print(number0 + / + number1 + = + result); catch (ArithmeticException e) System.out.println(Second number is 0, cannot do division!); 3.
68、2.3 异常的处理异常的处理(续续)例例3_14改进改进2021/8/2271JAVA语言程序设计清华大学 郑莉l运行结果运行结果Enter number 1abcInvalid integer entered. Please try again.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 异常的处理异常的处
69、理(续续)例例3_14运行结果运行结果2021/8/2272JAVA语言程序设计清华大学 郑莉3.2.4 生成异常对象生成异常对象l生成异常对象生成异常对象三种方式l由Java虚拟机生成l由Java类库中的某些类生成l在程序中生成自己的异常对象,也即是异常可以不是出错产生,而是人为地抛出生成异常对象都是通过throw语句实现,生成的异常对象必须是Throwable或其子类的实例lthrow new ThrowableObject();lArithmeticException e = new ArithmeticException(); throw e;2021/8/2273JAVA语言程序设计
70、清华大学 郑莉l生成异常对象举例生成异常对象举例class ThrowTest public static void main(String args) try throw new ArithmeticException(); catch(ArithmeticException ae) System.out.println(ae); try throw new ArrayIndexOutOfBoundsException(); catch(ArrayIndexOutOfBoundsException ai) System.out.println(ai); try throw new Strin
71、gIndexOutOfBoundsException(); catch(StringIndexOutOfBoundsException si) System.out.println(si); 3.2.4 生成异常对象生成异常对象(续续)例例3_162021/8/2274JAVA语言程序设计清华大学 郑莉l运行结果运行结果java.lang.ArithmeticExceptionjava.lang.ArrayIndexOutOfBoundsExceptionjava.lang.StringIndexOutOfBoundsException3.2.4 生成异常对象生成异常对象(续续)例例3_16运
72、行结果运行结果2021/8/2275JAVA语言程序设计清华大学 郑莉3.2.5 声明自己的异常类声明自己的异常类l声明自己的异常类声明自己的异常类除使用系统预定义的异常类外,用户还可声明自己的异常类 自定义的所有异常类都必须是Exception的子类一般的声明方法如下public class MyExceptionName extends SuperclassOfMyException public MyExceptionName() super(Some string explaining the exception); 2021/8/2276JAVA语言程序设计清华大学 郑莉l声明当除数
73、为零时抛出的异常类声明当除数为零时抛出的异常类DivideByZeroExceptionpublic class DivideByZeroException extends ArithmeticException public DivideByZeroException() super(Attempted to divide by zero); import java.io.*; public class Examp3_16 private static int quotient(int numerator, int denominator) throws DivideByZeroExcept
74、ion if (denominator = 0) throw new DivideByZeroException(); return(numerator / denominator); 3.2.5 声明自己的异常类声明自己的异常类(续续)例例3_172021/8/2277JAVA语言程序设计清华大学 郑莉public static void main(String args) int number1=0, number2=0, result=0; try System.out.println(Enter the first number:); number1 = Integer.valueOf
75、(Keyboard.getString().intValue(); System.out.println(Enter the second number:); number2 = Integer.valueOf(Keyboard.getString().intValue(); result = quotient(number1,number2); catch (NumberFormatException e) System.out.println(Invalid integer entered!); System.exit(-1); catch (DivideByZeroException e
76、) System.out.println(e.toString(); System.exit(-1); System.out.println(number1 + / + number2 + = + result); 3.2.5 声明自己的异常类声明自己的异常类(续续)例例3_172021/8/2278JAVA语言程序设计清华大学 郑莉l运行结果如下运行结果如下Enter the first number:140Enter the second number:0DivideByZeroException: Attempted to divide by zero3.2.5 声明自己的异常类声明自己
77、的异常类(续续)例例3_17运行结果运行结果2021/8/2279JAVA语言程序设计清华大学 郑莉3.3 方法重载方法重载l方法重载方法重载一个类中名字相同的多个方法这些方法的参数必须不同,Java可通过参数列表的不同来辨别重载的方法l或者参数个数不同l或者参数类型不同返回值可以相同,也可以不同重载的价值在于它允许通过使用一个方法名来访问多个方法2021/8/2280JAVA语言程序设计清华大学 郑莉l通过方法重载分别接收一个或几个不同数据类型的通过方法重载分别接收一个或几个不同数据类型的数据数据class MethodOverloading public void receive(int
78、i)System.out.println(Receive one int parameter. );System.out.println(i=+i);public void receive(double d)System.out.println(Receive one double parameter. );System.out.println(d=+d);public void receive(String s)System.out.println(Receive one String parameter. );System.out.println(s=+s);3.3 方法重载方法重载(续续
79、)例例3_182021/8/2281JAVA语言程序设计清华大学 郑莉 public void receive(int i,int j)System.out.println(Receive two int parameters. );System.out.println(i= + i + j= + j);public void receive(int i,double d)System.out.println(Receive one int parameter and one double parameter. );System.out.println(i= + i + d= + d);pub
80、lic class Examp3_17 public static void main(String args)MethodOverloading m = new MethodOverloading();m.receive(2);m.receive(5.6);m.receive(3,4);m.receive(7,8.2);m.receive(Is it fun?);3.3 方法重载方法重载(续续)例例3_182021/8/2282JAVA语言程序设计清华大学 郑莉l运行结果运行结果Receive one int parameter.i=2Receive one double parameter
81、.d=5.6Receive two int parameters.i=3 j=4Receive one int parameter and one double parameter.i=7 d=8.2Receive one String parameter.s=Is it fun?3.3 方法重载方法重载(续续)例例3_18运行结果运行结果2021/8/2283JAVA语言程序设计清华大学 郑莉3.4 本章小结本章小结l本章内容本章内容Java程序中类方法的控制结构,包括顺序、分支及循环三种基本结构Java的异常处理机制,包括对错误的分类方法,如何抛出异常、捕获异常方法的重载l本章要求本章要求掌握三种流程控制语法,并熟练应用了解Java的异常处理机制,会编写相应程序掌握方法重载的含义,并熟练应用2021/8/2284