一、单项选择题
1. 以下选项中,不属于 Java语句的是 [ 1
A. for语句 B. switch 语句 C. while语句 D. include语句
2. 以下选项中,不属于 Java语句的是 【 】
A. break语句 B. continue 语句 C. goto语句 D. for语句
3. 设i的初值为6, 则执行完j=i--; 后, i和j的值分别为 【 】
A. 6, 6 B. 6,5 C. 5,6 D. 5,5
4. 在一个 if语句中,下列选项中正确的是 【 】
A. if的个数一定多于 else的个数 B. if的个数一定与 else 的个数相等
C. if的个数一定少于 else 的个数 D. if的个数可能多于 else 的个数
5. switch语句中,大多数情况下,每个 case 块中最后一条语句应该是 【 】
A. default B. continue C. break D. goto
6. switch 语句中, 可以省略 break语句的块是 【 】
A. 第一个块 B. 最后一个块 C. 任意一个块 D. 哪个块都不行
7. switch语句中,如果没有相匹配的条件,则执行 【 】
A. 任一个 case后的语句 B. default 之后的语句
C. 所有 case 后的语句 D. 循环执行 switch 语句
8. 下列选项中,不是受检异常的是 【 】
A. ClassNotFoundException B. ArithmeticException
C. FileNotFoundException D. IOException
9. 下列选项中,与try语句配套使用的语句是 【 】
A. default B. catch C. break D. case
10. 处理异常时,catch 语句的后面,一般都会出现的语句是 【 】
A. default B. catch C. break D. finally
11. 假设有定义: String s= null, 则下列选项中, 能引发异常的是 【 】
Ⅰ. if((s! = null)&(s. length()>0))
Ⅱ. if((s! = null)&&(s. length()>0))
Ⅲ. if((s== null)| (s. length()==0))
Ⅳ. if((s== null)||(s. length()==0))
A. I B. Ⅰ和Ⅲ C.Ⅱ和Ⅳ D. Ⅲ
二、填空题
1. 能替换 for语句的语句是 do语句 或 while语句 。
2. 能替换 if语句的语句是Switch语句 。
3. switch语句中,表示条件的表达式只能是 int 类型或 char 类型。
4. while语句中, while后面的条件必须是 布尔 类型的。
5. 流控制语句有3类,对应于顺序流的语句是 赋值语句 。
6. 循环语句有 for 语句、while语句和 do 语句。
7. 分支语句有 if 语句和 switch语句。
8. 如果想使用其他包中的类,则需要在程序的开头使用 import 语句。
三、简答题
1. 请说明 switch 语句的执行过程。
答:表达式求值:首先,switch 语句会对括号内的表达式 expression 进行求值。这个表达式的值必须是一个整数(byte、short、int、char 或者它们的包装类,也可以是枚举类型)。
查找匹配的 case:接着,switch 语句会寻找一个 case 子句,其中的常量表达式(constant)与 expression 的值相等。如果找到匹配的 case 子句,那么就执行该 case 子句后面的代码块。
执行代码块:从匹配的 case 子句开始,执行相应的代码块。如果未使用 break 语句,程序将继续执行下一个 case 子句的代码块(即所谓的“fall-through”行为)。
使用 break:break 语句用于终止当前 case 代码块的执行,并跳出整个 switch 语句。如果不希望出现“fall-through”,应在每个 case 的末尾加上 break。
默认情况:如果没有任何 case 子句与 expression 的值匹配,那么 switch 语句会执行 default 子句(如果有的话)。default 子句是可选的,通常用来处理未预料的情况。
- 程序3.1中如果某个 break语句不写,则程序执行时的输出是什么? 举例说明。
答:如果在 switch 语句中的某个 case 子句后面没有写 break 语句,那么程序会继续执行下一个 case 子句的代码块,即使它不匹配当前的 expression 值。这种现象被称为“fall-through”,Switch的穿透性。
- 请说明嵌套的 if语句中,else语句的对应规则。
答:在Java中,else 语句与最近的未配对的 if 语句配对。如果有多个 if 语句嵌套在一起,那么 else 会与最近的那个 if 语句配对。
- 请简要说明 while语句与 do语句的不同之处。
答:while语句是先计算条件表达式的值,当值为真时,重复执行循环体育局,直到表达式为假结束;
Do语句是首先执行循环体语句,然后判定条件表达式的值,当值为真时,重复执行循环体语句,直到表达式的值为假时结束。
- 请简要说明 while语句与 for语句的适用情况。
答:while 循环:适用于在进入循环之前无法确切知道循环次数,但可以根据条件退出循环的情况。
for 循环:适用于在进入循环之前就已经知道循环次数,或者需要对循环变量进行初始化和更新的情况。
- 什么是异常? 解释“抛出”和“捕获”的含义。
答:异常(Exception)是指程序在运行时发生的非正常情况或错误,这些情况通常会导致程序的正常执行流程中断。
抛出:当程序检测到错误时,通过 throw 关键字创建并抛出异常对象。
捕获:通过 try-catch 块来捕获并处理异常,防止程序因异常而终止。
- Java 是如何处理异常的?
答:异常类(Exception Class):Java 定义了一系列异常类,用于表示各种类型的错误和异常情况。这些类通常继承自 java.lang.Throwable 类,其中最常见的基类是 java.lang.Exception。
抛出异常(Throwing Exceptions):当程序检测到错误或异常情况时,可以通过 throw 关键字抛出一个异常对象。
捕获异常(Catching Exceptions):使用 try-catch 语句块来捕获并处理异常。如果在 try 块中抛出了异常,则控制权会转移到相应的 catch 块。
finally 块:finally 块是可选的,它通常用于释放资源或执行清理工作,无论是否发生异常,finally 块中的代码都会被执行。
声明抛出异常(Declaring Thrown Exceptions):如果一个方法有可能抛出检查型异常(checked exceptions),则必须在方法签名中声明它可能抛出的异常类型。
- try及 catch 语句的作用是什么? 语法格式如何?
答:try 块用于包裹那些可能抛出异常的代码。如果在 try 块中抛出了异常,那么控制权会立即转移到与之匹配的 catch 块。如果没有匹配的 catch 块,则异常会继续向上抛出,直到被更高层级的 try-catch 块捕获,或者导致程序终止。
catch 块用于处理从 try 块中抛出的异常。当 try 块中的代码抛出一个异常时,控制权会转移到 catch 块。如果 catch 块能够处理该异常,程序会继续执行 catch 块中的代码。如果 catch 块不能处理该异常,或者没有匹配的 catch 块,异常将继续向上抛出。
try {
// 可能抛出异常的代码
} catch (ExceptionType1 e1) {
// 处理 ExceptionType1 类型的异常
} catch (ExceptionType2 e2) {
// 处理 ExceptionType2 类型的异常
} finally {
// 无论是否发生异常都会执行的代码
}
- 在什么情况下执行 try语句中 finally 后面的代码段? 在什么情况下不执行?
答:finally 块是 try-catch 语句的一部分,用于执行无论是否发生异常都需要执行的代码。
不执行的情况:
程序提前终止:如果在 try 块之前或者 finally 块之后的代码中出现了系统退出(如 System.exit(0)),那么 finally 块不会被执行。
虚拟机崩溃:如果 JVM 自身出现了严重错误导致崩溃,那么 finally 块也不会被执行。
覆盖 finally 块:如果在一个 catch 块中使用了 System.exit(0) 或其他方法导致程序提前终止,那么 finally 块也不会被执行。
- 说出 Java中常见的几个异常,它们表示什么意思? 在什么情况下引起这些异常?
答:1. NullPointerException (NPE)
含义:当试图访问一个 null 对象的属性或方法时抛出。
情况:通常发生在试图调用 null 对象的方法或访问其字段时。
2. ArrayIndexOutOfBoundsException
含义:当试图访问数组中的无效索引时抛出。
情况:当索引小于 0 或大于等于数组长度时。
3. ArithmeticException
含义:当执行算术运算时遇到非法操作时抛出。
情况:最常见的原因是除数为零。
4. ClassCastException
含义:当试图将对象强制转换为不兼容的类型时抛出。
情况:尝试将对象转换为不是其子类的类型。
5. NumberFormatException
含义:当试图将字符串转换为数值类型但字符串格式不正确时抛出。
情况:字符串包含非数字字符或不符合数值格式。
11. 以下语句要打印从7开始的正奇数,但程序中有错误,请改正,然后写出此循环语句的循环次数。
int k=7;
do{
System. out. println(k--);
//k--;
} while(k ! =0);
四、程序填空题
1. 某人以年利率r向银行存款m元,一年后存款额为m*(1+r),他想知道存多少年后,存款额会达到原来的k倍。以下方法已知m、r和k,计算至少多少年后存款额大于等于m*k。
public int calYears( double m, double r, int k){
double money; int years =0;
money=m;
while( money>m*k ){
years = years+1;
money * = (n+1);
return years;
}
l.
2. 方法 void Fibonacci ( int m) 的功能是输出不大于m的 Fibonacci数列中的元素。
注:Fibonacci数列的前两个数都是1,从第三个数开始,数列的每个数是其前面两个数之和。
void Fibonacci( int m){
int f1 =1, f2 =1, f3;
System. out. println( fl);
System. out. println(f2);
while( true){
f3 =f1 +f2;
if(f3>m) break;
System. out. println(f3);
f1 =f2;
f2 = f3;
}
}
五、程序设计题
1. 设n为自然数,
n! =1×2×3×……×n
称为n的阶乘, 并且规定0! =1。试编制程序计算2!,4!,6!,8! 和10!,并显示计算结果。
答://自然数结果sum
// int sum = 1;
// //自然数a
// int a = 10;
// if(a == 0){
// System.out.println(a+"!=1");
// }else if (a > 0){
// for(int i=1;i<=a;i++){
// sum *= i;
// //System.out.println(sum);
// }
// System.out.println(sum);
// }else{
// System.out.println("不能是负数");
// }
- 已知变量n,请写出使用 for语句计算s=1+1/2+1/3+...+1/n的代码。
答:// double sum=0;
// double n=2;
// for(int i=1;i<=n;i++){p
// sum +=(1.0/i);
// }
// System.out.println(sum);
- 已知变量n,请写出使用 for语句计算s=1+1/3+1/6+...+1/3*n的代码。
答: double sum=1;
double n=5;
for(int i=1;i<n;i++){
sum +=(1.0/(i*3));
}
System.out.println(sum);
4. 编写程序打印下面的图案。
答:// 上半部分
// for (int i = 0; i < 3; i++) {
// for (int j = 0; j < i; j++) {
// System.out.print(" ");
// }
// for (int k = 0; k < 7 - (2*i); k++) {
// System.out.print("*");
// }
// System.out.println();
// }
// // 下半部分
// for (int i = 0; i < 4; i++) {
// // 输出“-”
// for (int j = 0; j < 3 - i; j++) {
// System.out.print(" ");
// }
// // 输出“* ”
// for (int k = 0; k < (2*i) + 1; k++) {
// System.out.print("*");
// }
// System.out.println();
// }
5. 编写程序打印下面的图案。
答:for(int a = 0;a<10;a++){
for(int b = 0;b < 10-a ;b++){
System.out.print("*");
}
System.out.println();
}
- 编写程序打印乘法口诀表。
答:int size = 9;
for (int i = 1; i <= size; i++) {
for (int j = 1; j <= i; j++) {
System.out.printf("%d * %d = %2d ", j, i, i * j);
}
System.out.println(); // 换行
}