System.out.print(arrayOfInts[i]+"");
}
System.out.println();
}
}
这个程序的输出为:
3287358912107620008622127.
这里注意你可以在for循环的初始化语句中声明一个本地变量。
这个变量的作用域只是在for语句的块中,它可以用在终止条件语句和增量表达式中。
如果控制for循环的变量没有用在循环的外部,最好的方法是在初始化表达式中声明这个变量。
例如i、j、k等经常用来在for控制语句中,在for循环的初始化表达式中声明它们来限制它们的生命周期以减少错误
3.4.3if-else语句
if语句可以使程序根据一些条件有选择地执行语句。
举个例子,假如你的程序根据boolean变量DEBUG的值来打印了调试信息。
如果DEBUG是true,你的程序就打印出调试信息,比如变量x的数值;或者就不打印。
具体的程序如下:
if(DEBUG){
System.out.println("DEBUG:
x="+x);
}
上面是一个简单的if语句的例子。
总得说来,if语句的语法格式为:
if(表达式){
语句(参数)
}
如果你想在if判断表达式为false的时候执行不同的语句,你可以使用else语句。
举个另外的例子吧,假如你的程序需要执行不同的工作,主要是根据用户是点击OK键还是击警告窗口中的其它按钮。
你可以使用if和else语句来实现这个目的:
...
//responseiseitherOKorCANCELdepending
//onthebuttonthattheuserpressed
...
if(response==OK){
//在这里添加执行OK动作的代码
}else{
//在这里添加执行Cancel动作的代码
3.4.3if-else语句
如果if部分为false,则执行else块。
另外一种else语句的格式是elseif,它根据执行另外的表达式执行语句。
一个if语句可以跟着任意个elseif语句,但只能有一个else语句。
下面是一个例程IfElseDemo,它根据测试分数的数值来指定一个等级:
90%或者更高为A,80%或者更高为B等等。
publicclassIfElseDemo{
publicstaticvoidmain(String[]args){
inttestscore=76;
chargrade;
if(testscore>=90){
grade='A';
}elseif(testscore>=80){
grade='B';
}elseif(testscore>=70){
grade='C';
}elseif(testscore>=60){
grade='D';
}else{
grade='F';
}
System.out.println("Grade="+grade);
}
}
程序的输出为:
Grade=C
3.4.3if-else语句
这时你可以注意到testscore的数值可以满足组合if条件76>=70and76>=60,但是当系统处理组合if语句的时候,一旦条件满足,适当的语句就将被执行(grade='C';),并且不需要计算剩余的条件控制就跳出if语句。
JAVA编程语言支持运算符?
:
,它是一个简化的if语句。
下面再看看上面教程中的MaxVariablesDemo程序:
if(Character.isUpperCase(aChar)){
System.out.println("Thecharacter"+aChar+"isuppercase.");
}else{
System.out.println("Thecharacter"+aChar+"islowercase.");
}
下面你可以利用?
:
运算符来重写这段代码:
System.out.println("Thecharacter"+aChar+"is"+
(Character.isUpperCase(aChar)?
"upper":
"lower")+
"case.");
如果这个isUpperCase方法返回true,这个?
:
运算符返回字符串"upper"。
或则,它就返回字符串"lower"
3.4.4switch语句
使用switch语句可以根据一个整型表达式有条件地执行语句。
下面的例程SwitchDemo,声明了一个整型变量month,它的数值代表了月份。
这个程序显示了月份的名字,主要是根据month的数值并且使用了switch语句。
publicclassSwitchDemo{
publicstaticvoidmain(String[]args){
intmonth=8;
switch(month){
case1:
System.out.println("January");break;
case2:
System.out.println("February");break;
case3:
System.out.println("March");break;
case4:
System.out.println("April");break;
case5:
System.out.println("May");break;
case6:
System.out.println("June");break;
case7:
System.out.println("July");break;
case8:
System.out.println("August");break;
case9:
System.out.println("September");break;
case10:
System.out.println("October");break;
case11:
System.out.println("November");break;
case12:
System.out.println("December");break;
}
}
}
这个switch语句计算它的表达式,在这个例子中是计算month的数值,然后计算适当的case语句。
这样,程序的输出为:
August。
3.4.4switch语句
当然,你可以使用if语句来实现它:
intmonth=8;
if(month==1){
System.out.println("January");
}elseif(month==2){
System.out.println("February");
}
...
决定使用if语句还是switch语句的关键主要是根据可读型以及其它因素。
if语句可以在更大范围或者条件来决定,而switch只有根据单个整型变量来做决定。
同时,提供给case语句的数值必须是单一的。
另外一点是,switch语句在每个case之后有一个break语句。
每个break语句终止了swtich语句,并且控制流程继续switch块之后的第一个语句。
break语句是必须的,因为没有它,case语句就会失效,也就是说,没有break语句,控制流程按顺序执行case语句。
下面的程序SwichDemo2将介绍为什么它是有效的;
这个程序的输出为:
NumberofDays=29
最后的break语句是不需要的,因为流程将跳出switch语句了。
但是,我们推荐使用为最后一个case语句使用一个break以防你需要还增加更多的case语句。
这就使得更容易修改代码以及减少错误。
一般地,你可以使用break来在分支语句中终止循环。
最后你可以在switch最后使用缺省地语句来处理所有的上面没有处理的情况。
intmonth=8;
...
switch(month){
case1:
System.out.println("January");break;
case2:
System.out.println("February");break;
case3:
System.out.println("March");break;
case4:
System.out.println("April");break;
case5:
System.out.println("May");break;
case6:
System.out.println("June");break;
case7:
System.out.println("July");break;
case8:
System.out.println("August");break;
case9:
System.out.println("September");break;
case10:
System.out.println("October");break;
case11:
System.out.println("November");break;
case12:
System.out.println("December");break;
default:
System.out.println("Hey,that'snotavalidmonth!
");break;
}
3.4.5异常处理语句
JAVA编程语言提供一个异常机制用来帮助程序报告和处理错误。
当一个错误发生的时候,程序就产生一个异常。
即正常的程序路程被中断并且系统缓建想找到一个异常处理:
一个能处理特殊类型错误的代码块。
这个异常福利可以视图恢复错误或者如果它决定了错误是不可修复的,它提供一个较好退出程序的方法。
有三条语句可以处理异常:
1.try语句,它可以在异常产生的地方识别语句块。
2.catch语句,它必须和try语句一起用,它可是识别可以处理特定异常错误的语句块。
这个语句是在如果有一个特定的异常发生在try块中就被执行。
(3)finally语句,它必须跟try语句一起用,它可以识别语句块,这些语句块是在不管在try块中是否有错误发生被执行的。
下面是这三个语句的语法格式:
try{
语句(参数)
}catch(异常错误类型名字){
语句(参数)
}finally{
语句(参数)
}
上面简述了由JAVA编程语言提供的用来报告和处理错误的语句。
但是,另外的因素和原因,比如运行和检查异常之间的差异以及异常类的分级结构(代表异常的不同种类)在使用异常机制的时候起着重要的作用。
3.4.6分支语句
JAVA编程语言支持下面的三种分支结构:
break语句
continue语句
return语句
下面逐个介绍:
(1)break语句
break语句有两种形式:
未标志的和标志的。
你在前面就已经看过了未标志的break语句。
一个未标志的break语句终止swtich语句,控制流程马上转到switch语句下方的语句。
下面的例程BreakDemo,它包含了一个for循环查找数组中特定的数值:
publicclassBreakDemo{
publicstaticvoidmain(String[]args){
int[]arrayOfInts={32,87,3,589,12,1076,
2000,8,622,127};
intsearchfor=12;
inti=0;
booleanfoundIt=false;
for(;iif(arrayOfInts[i]==searchfor){
foundIt=true;
break;
}
}
if(foundIt){
System.out.println("Found"+searchfor+"atindex"+i);
}else{
System.out.println(searchfor+"notinthearray");
}
}
}
当数值被找到的时候,这个break语句终止了for循环。
控制流程就转到for语句的下面的语句继续执行。
这个程序的输出为:
Found12atindex4
3.4.6分支语句
未标志形式的break语句被用来终止内部的switch、for、while或者do-while。
而标志形式的break语句终止一个外部的语句,它是通过在break语句中使用一个标志来实现的。
下面的例程BreakWithLabelDemo跟前面的例子有点相似,只不过它是在一个两维数组中搜索一个数值。
利用两个嵌套的for循环遍历了整个数组。
当数值被找到了,标志形式的break语句就终止标志的search语句,这个search语句是在for循环外部的:
publicclassBreakWithLabelDemo{
publicstaticvoidmain(String[]args){
int[][]arrayOfInts={{32,87,3,589},
{12,1076,2000,8},
{622,127,77,955}
};
intsearchfor=12;
inti=0;
intj=0;
booleanfoundIt=false;
search:
for(;ifor(j=0;jif(arrayOfInts[i][j]==searchfor){
foundIt=true;
breaksearch;
}
}
}
if(foundIt){
System.out.println("Found"+searchfor+"at"+i+","+j);
}else{
System.out.println(searchfor+"notinthearray");
}
}
}
这个程序的输出为:
Found12at1,0
这个语法看起来可能有点费解。
break语句终止了标志语句,它不能将控制流程转到这个标志处。
控制流程迅速将标志(终止的)后面的语句。
2)continue语句
你可以使用continue语句来跳过当前的for、while或者do-while循环。
未标志形式跳到内部循环体的末尾处并且计算控制循环的boolean表达式,跳过循环的其它部分。
下面的例程ContinueDemo遍历字符串中的所有字母。
如果当前字母不是一个p,contiue语句就忽略循环的其它部分并且处理下一个字符。
如果它是一个p字母,程序就对计数器增1,再将p转换维大写字母:
publicclassContinueDemo{
publicstaticvoidmain(String[]args){
StringBuffersearchMe=newStringBuffer(
"peterpiperpickedapeckofpickledpeppers");
intmax=searchMe.length();
intnumPs=0;
for(inti=0;i//interestedonlyinp's
if(searchMe.charAt(i)!
='p')
continue;
//processp's
numPs++;
searchMe.setCharAt(i,'P');
}
System.out.println("Found"+numPs+"p'sinthestring.");
System.out.println(searchMe);
}
}
这个程序的输出为:
Found9p'sinthestring.
PeterPiPerPickedaPeckofPickledPePPers
标志形式的continue语句将忽略外部给定标志的循环。
下面的例程ContinueWithLabelDemo,它使用了一个嵌套的循环来搜索一个子字符串。
程序如下:
publicclassContinueWithLabelDemo{
publicstaticvoidmain(String[]args){
StringsearchMe="Lookforasubstringinme";
Stringsubstrin