第3章(类的方法).ppt
第3章 类的方法,Page 2,目录,3.1 方法的控制流程3.2 异常处理简介3.3 方法的重载(overloading)3.4 本章小结,Page 3,3.1 方法的控制流程,方法的控制流程Java程序通过控制语句来控制方法的执行流程Java中的流程控制结构主要有三种顺序结构选择结构if语句(二路选择结构)switch语句(多路选择结构)循环结构for语句while语句do-while语句,Page 4,3.1.1 if选择结构,语法形式只有if分支,没有else分支if(boolean-expression)/statement1;if-else语句if(boolean-expression)/statement1;else/statement2;,Page 5,if-else语句的特殊形式if(boolean expression)/statement1;else if(boolean expression)/statement2;else if(boolean expression)/statement;else/statement;,注意:else子句不能单独作为语句使用,它必须和if配对使用。else总是与离它最近的且尚未配对的if匹配,可以通过使用 来改变匹配关系。,Page 6,例3-1 计算每个月的天数(暂不考虑闰年)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);,Page 7,输入一个年份,判断它是不是闰年。闰年:能被4整除但不能被100整除,或者能被400整除。import java.io.*;public class LeapTest public static void 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();,Page 8,IsLeapYear=(year%4=0,Page 9,输入两个整数比较大小import java.io.*;public class ex3_2 public static void main(String args)throws IOException int x,y;BufferedReader 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(xy);else System.out.println(x=y);,Page 10,以条件运算符代替if-else例子:if(ab)System.out.println(The larger one is:+a);else System.out.println(The larger one is:+b);用条件运算符重写:System.out.println(The larger one is:+(ab)?a:b);,Page 11,已知一个学生的分数,给出其分数等级。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=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);,Page 12,3.1.2 switch选择结构,switch语句是多分支的选择结构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;注意问题switch-expression、常量值value1到valueN必须是整型或字符型如果表达式的值和某个case后面的值相同,则从该case之后开始执行,直到break语句为止default是可有可无的,若没有一个常量与表达式的值相同,则从default之后开始执行,Page 13,if(i=1)statementA;else if(i=2)statementB;else if(i=3)|(i=4)statementC;else if(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;,用switch代替if,Page 14,例3-2 使用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=31;return(days);,Page 15,例3-3 用switch语句实现成绩分类的功能。import static java.lang.Math;/静态引入enum Grade A,B,C,D,E;/枚举类型定义public class Grade public static char gradeLevel(double g)int n=(int)floor(g/10);/等价于(int)Math.floor(g/10);switch(n)case 10:case 9:return Grade.A;case 8:return Grade.B;case 7:return Grade.C;case 6:return Grade.D;default:return Grade.E;,Page 16,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(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);,Page 17,输入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();,Page 18,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(Friday);break;case 6:System.out.println(Saturday);break;default:System.out.println(Day out of range);break;,Page 19,for循环结构是Java三个循环语句中功能较强、使用较广泛的一个for循环可以嵌套一般语法格式如下for(start-expression;check-expression;update-expression)/body of the loop;,3.1.3 for循环结构,Page 20,解释start-expression完成循环变量和其他变量的初始化工作check-expression是返回布尔值的条件表达式,用于判断循环是否继续update-expression用来修整循环变量,改变循环条件三个表达式之间用分号隔开,Page 21,for语句的执行过程首先根据初始表达式start-expression,完成必要的初始化工作;再判断表达式check-expression的值,若为真,则执行循环体执行完循环体后再返回表达式update-expression,计算并修改循环条件,这样一轮循环就结束了第二轮循环从计算并判断表达式check-expression开始,若表达式的值仍为真,则循环继续,否则跳出整个for语句执行for循环下面的句子,Page 22,例3-4 打印九九乘数表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();,Page 23,增强for循环(JDK5.0之后),增强for循环的功能:用来对数组或集合对象进行遍历。语法格式:for(Type name:Array/Set)/循环体,Page 24,例3-5 使用增强for循环打印星期一到星期日的英文名。public class PrintDay public static void main(String args)String days=Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,“Sunday;for(String day:days)System.out.print(day+);System.out.println();,Page 25,输入一个整数,输出它所有的因数import java.io.*;public class ex3_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=0)System.out.print(k+);System.out.println();,Page 26,逗号运算符可用在 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);,Page 27,while语句实现“当型”循环,其一般语法格式如下:while(check-expression)/body of the loop;条件表达式(check-expression)的返回值为布尔型循环体可以是单个语句,也可以是复合语句块执行过程先判断check-expression的值,为真则执行循环体循环体执行完后再无条件转向条件表达式做计算与判断;当计算出条件表达式的值为假时,跳过循环体执行while语句后面的语句。若为真,则继续执行循环特点:它的循环体可能一次也不被执行,3.1.4 while循环结构,Page 28,循环接受并输出从键盘输入的字符,直到输入的字符为回车为止char ch=a;while(ch!=n)System.out.println(ch);ch=(char)System.in.read();/接收键盘输入,Page 29,计算数列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);,Page 30,例3-6 计算存款收益:假设银行中存款10000元,按11.25%的利率,一年后连本带利将变为11125元。你若将此款继续存入银行,试问多长时间就会连本带利翻一番。import java.text.*;public class CalProfit public static void main(String args)double original,money,interest;int years=0;original=money=10000;interest=11.25/100;System.out.println(yeart money);,Page 31,while(money 2*original)years=years+1;money=money+(interest*money);System.out.printf(%dt%.2fn,years,money);/end of while System.out.println();System.out.printf(第%d 年存款额达到%.2f元,years,money);/end of main/end of class,Page 32,do-while语句实现“直到型”循环一般语法结构如下do/body of the loop;while(check-expression);其使用与while语句很类似,不同的是它首先无条件的执行一遍循环体,再来判断条件表达式的值,若表达式的值为真,则再运行循环体,否则跳出do-while循环,执行下面的语句特点:它的循环体至少要执行一次,3.1.5 do-while循环结构,Page 33,/while(i=10)sum+=i;i+;System.out.println(sum=+sum);,/do sum+=i;i+;while(i=10);System.out.println(sum=+sum);,比较这两段程序,Page 34,输入一个整数,然后输出它的翻转形式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().intValue();System.out.print(The number in reverse order is);do right_digit=n%10;System.out.print(right_digit);n/=10;while(n!=0);,Page 35,功能跳出循环,不再执行剩余部分。有两种使用格式:(1)不带标号的break语句;(2)带标号的break语句适用场合在switch 结构中,用来终止switch语句的执行。在循环结构中,不带标号的break语句用于终止break语句所在的最内层循环;带标号的break语句将跳出标号所标识的循环。也可用在代码块中,用于跳出它所指定的块。,3.1.6 break语句,Page 36,例3-7 简单break应用举例public class BreakTest public static void main(String args)String output=;int i;for(i=1;i=10;i+)if(i=5)break;output+=i+;output+=nBroke out of loop at i=+i;System.out.println(output);,Page 37,例3-8 在嵌套循环中使用break语句:使用下面的程序来实现例3-4的九九乘法表。public class Ex3_6public static void main(String args)for(int i=1;i i)break;/跳出内循环 System.out.print(+i+*+j+=+i*j);System.out.println();,Page 38,例3-9 break与label一同使用举例public class Ex3_7public static void main(String args)outer:for(int i=1;i i)break;/跳出内循环 if(i=6)break outer;/跳出outer标识的循环 System.out.print(+i+*+j+=+i*j);System.out.println();,Page 39,continue语句必须用于循环结构中停止本次迭代,回到循环起始处,开始下一次迭代过程有两种使用格式不带标号的continue语句终止当前这一轮的循环,跳出本轮循环剩余的语句,直接进入当前循环的下一轮。带标号的continue语句使程序的流程直接转入标号标明的循环层次。,3.1.7 continue语句,Page 40,不带标号的continue语句在while或do-while循环中,会使流程直接跳转至条件表达式在for循环中,会使流程跳转至表达式update-expression,计算并修改循环变量后再判断循环条件,Page 41,例3-10 简单的continue语句举例public class ContinueTestpublic static void main(String args)String output=;int i;for(i=1;i=10;i+)if(i=5)continue;output+=i+;output+=nUsing continue to skip printing 5;output+=ni=+i;System.out.println(output);,Page 42,例3-11 打印2到9之间的偶数的平方,但是不包括偶数6的平方public class Ex3_9public static void main(String args)for(int i=2;i=9;i+=2)if(i=6)continue;System.out.println(i*i);,Page 43,带标号的continue语句格式:continue label;/label为标号名称标号label应该定义在程序中某一循环语句前面,用来标志这个循环结构,Page 44,例3-12 九九乘法表也可用下面的程序来实现public class Ex3_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);,当执行到满足条件ij时,跳出inner循环,直接跳到outer循环,计算并修改i的值,进行下一轮的循环。,Page 45,异常处理在进行程序设计时,错误的产生是不可避免的。所谓错误,是在程序运行过程中发生的异常事件,这些事件的发生将阻止程序的正常运行。如何处理错误?把错误交给谁去处理?程序又该如何从错误中恢复?为了加强程序的鲁棒性,Java语言具有特定的运行错误处理机制。,3.2 异常处理简介,Page 46,3.2.1 异常处理的意义,1.异常(Exception)的基本概念异常又称为例外,是特殊的运行错误对象,对应着Java语言特定的运行错误处理机制。是面向对象规范的一部分,是异常类的对象。Java中声明了很多异常类,每个异常类都代表了一种运行错误,类中包含了该运行错误的信息处理错误的方法每当Java程序运行过程中发生一个可识别的运行错误时,即该错误有一个异常类与之相对应时,系统都会产生一个相应的该异常类的对象,即产生一个异常。,Page 47,2.Java处理错误的方法抛出(throw)异常在方法的运行过程中,如果发生了异常,则该方法生成一个代表该异常的对象并把它交给运行时系统,运行时系统便寻找相应的代码来处理这一异常。捕获(catch)异常运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止。,Page 48,探测抛出异常,捕获处理异常,调用,图3-1 异常处理示意图,Page 49,Java异常处理机制的优点将错误处理代码从常规代码中分离出来按错误类型和差别分组对无法预测的错误的捕获和处理克服了传统方法的错误信息有限的问题把错误传播给调用堆栈,Page 50,3.2.2 错误的分类,错误程序中的错误可分为三种类型:编译错误、运行错误、逻辑错误。编译错误是编译器能够检测到的错误,一般为语法错误;运行错误是运行时产生的错误,如被零除、数组下标越界等;逻辑错误是机器本身无法检测的,需要人对运行结果及程序逻辑进行认真分析,逻辑错误有时会导致运行错误。,Page 51,根据错误的严重程度不同,可分为两类错误致命性的,用户程序无法处理Error类是所有错误类的父类异常非致命性的,可编制程序捕获和处理Exception类是所有异常类的父类,Page 52,再对异常进行分类非检查型异常不能期望程序捕获的异常(如数组越界,除零等)继承自RuntimeException在方法中不需要声明,编译器也不进行检查检查型异常其他类型的异常如果被调用的方法抛出一个类型为E的检查型异常,那么调用者必须捕获E或者也声明抛出E(或者E的一个父类),对此编译器要进行检查,Page 53,异常类和错误类的层次结构,Page 54,Java预定义的一些常见异常ArithmeticException整数除法中除数为0NullPointerException 访问的对象还没有实例化NegativeArraySizeException 创建数组时元素个数是负数ArrayIndexOutOfBoundsException访问数组元素时,数组下标越界ArrayStoreException程序试图向数组中存取错误类型的数据FileNotFoundException试图存取一个并不存在的文件IOException通常的I/O错误,Page 55,例3-11 测试系统定义的运行异常数组越界出现的异常。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+;,Page 56,3.2.3 异常的处理,对于检查型异常,Java强迫程序必须进行处理。处理方法有两种:(1)声明抛出异常不在当前方法内处理异常,而是把异常抛出到调用方法中(2)捕获异常使用try catch()块,捕获到所发生的异常,并进行相应的处理,Page 57,1.声明抛出异常如果程序员不想在当前方法内处理异常,可以使用throws子句声明将异常抛出到调用方法中。如果所有的方法都选择了抛出此异常,最后 JVM将捕获它,输出相关的错误信息,并终止程序的运行。在异常被抛出的过程中,任何方法都可以捕获它并进行相应的处理。,Page 58,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 如果在openThisFile中抛出了FileNotfoundException异常,getCustomerInfo将停止执行,并将此异常传送给它的调用者。,Page 59,2.捕获异常:try、catch和finally语句语法格式:try/此处为抛出具体异常的代码 catch(ExceptionType1 e)/抛出ExceptionType1异常时要执行的代码 catch(ExceptionType2 e)/抛出ExceptionType2异常时要执行的代码 catch(ExceptionTypek name)/抛出ExceptionTypek异常时要执行的代码 finally/必须执行的代码,但finally子句不是必需的,Page 60,说明try 语句 其后跟随可能产生异常的代码块catch语句其后跟随异常处理语句,通常用到两个方法:getMessage()返回一个字符串对发生的异常进行描述。printStackTrace()给出方法的调用序列,一直到异常的产生位置。finally语句不论在try代码段是否产生异常,finally 后的程序代码段都会被执行。通常在这里释放内存以外的其他资源。注意事项在类层次树中,一般的异常类型放在后面,特殊的放在前面。,Page 61,例3-12 读入两个整数,第一个数除以第二个数,之后输出。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+=);int result=number1/number2;System.out.println(result);,Page 62,其中,Keyboard类的声明如下:import java.io.*;public class Keyboardstatic BufferedReader inputStream=new BufferedReader(new InputStreamReader(System.in);public static int getInteger()try return(Integer.valueOf(inputStream.readLine().trim().intValue();catch(Exception e)e.printStackTrace();return 0;,Page 63,public static String getString()try return(inputStream.readLine();catch(IOException e)return 0;,Page 64,例3-13 捕获 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.println(Enter the second number:);number2=Integer.valueOf(Keyboard.getString().intValue();,Page 65,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(result);,Page 66,例3-14 捕获被零除的异常(ArithmeticException类型的异常)import java.io.*;public class ExceptionTester3 public static void main(String args)int number1=0,number2=0,result=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();result=number1/number2;,Page 67,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);System.out.print(number1+/+number2+=+result);,Page 68,对例3-14程序进行改进:重复提示输入,直到输入合法的数据。为了避免代码重复,可将数据存入数组。import java.io.*;public class ExceptionTester4 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);,Page 69,numberi=Integer.valueOf(Keyboard.getString().intValue();valid=true;catch(NumberFormatException e)System.out.println(Invalid integer entered.Please tryagain.);/end of for try result=number0/number1;System.out.print(number0+/+number1+=+result);catch(ArithmeticException e)System.out.println(Second number is 0,cannot do division!);,Page 70,3.2.4 生成异常对象,生成异常对象三种方式由Java虚拟机生成由Java类库中的某些类生成在程序中也可以生成自己的异常对象,也即异常可以不是出错产生,而是人为地抛出生成异常对象都是通过throw语句实现,生成的异常对象必须是Throwable或其子类的实例throw new ThrowableObject();ArithmeticException e=new ArithmeticException();throw e;,Page 71,例3-16 生成异常对象举例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);,Page 72,try throw new StringIndexOutOfBoundsException();catch(