场景:
今天错好多道题,人都傻掉了错题
错题1描述:
下面的程序的输出结果:
public class Test {
public static void main(String[] args) {
System.out.println(test());
}
private static int test() {
int temp = 1;
try {
System.out.println(temp);
return ++temp;
} catch (Exception e) {
System.out.println(temp);
return ++temp;
} finally {
++temp;
System.out.println(temp);
}
}
}
选项如下:
A.1,2,2
B.1,2,3
C.1,3,3
D.1,3,2
原因分析:
考察的是try-catch-finally
先是 temp = 1 然后进入try块里面:打印 1 然后将temp改成2 没有捕捉到异常:进入finally:temp=3 同时打印出来3 接着返回try里面的temp2,并打印出来.
关键一点是 finally不会影响try返回的结果。
相当于try已经把返回的数据上交了。这个时finally还有操作机会。但是不会影响try上交的结果
我们可以简单打印一下:
输出结果:
答案:D
错题2描述:
下列关于if-else if选择结构的说法正确的是(多选题)
A.多个else if块之间的顺序可以改变,改变之后对程序的执行结果没有影响
B.多个else if块之间的顺序可以改变,改变之后可能对程序的执行结果有影响
C.多个else if块之间的顺序不可以改变,改变后程序编译不通过
D.多个else if块之间的顺序可以改变,改变后程序编译可以通过
原因分析:
举个例子就这道为什么为什么包括B
int age = 11;
int a = 0;
if(age < 10){
a += 1;
}else if(age < 15){
a += 2;
}else if(age < 25){
a += 3;
}
上面的代码 两个else-if如果互换位置 a的值就不一样了
答案: B D
错题3描述:
关于下面这段Java程序,哪些描述是正确的:( )
public class ThreadTest extends Thread {
public void run() {
System.out.println("In run");
yield();
System.out.println("Leaving run");
}
public static void main(String []argv) {
(new ThreadTest()).start();
}
}
选项如下(单选题):
A.程序运行输出只有In run
B.程序运行输出只有Leaving run
C.程序运行输出先有In run后有Leaving run
D.程序运行输出先有Leaving run后有In run
E.程序没有任何输出就退出了
F.程序将被挂起,只能强制退出
原因分析:
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。
这道题只有一个子线程对象,并没有多个子线程对象。所以跟yield()没有关系。
答案:c
错题4描述:
关于下面这哪些描述是正确的:( )
A.我们直接调用Thread对象的run方法会报异常,所以我们应该使用start方法来开启一个线程
B.一个进程是一个独立的运行环境,可以被看做一个程序或者一个应用。而线程是在进程中执行的一个任务。
Java运行环境是一个包含了不同的类和程序的单一进程。线程可以被称为轻量级进程。
线程需要较少的资源来创建和驻留在进程中,并且可以共享进程中的资源
C.synchronized可以解决可见性问题,volatile可以解决原子性问题
D.ThreadLocal用于创建线程的本地变量,该变量是线程之间不共享的
原因分析:
synchronized很强大,既可以保证可见性,又可以保证原子性,而volatile不能保证原子性! 排除C
A:直接调用线程的run()不会报错,但是没有效果,所以排除A
答案:B D
错题5描述:
关于下面这段Java程序,哪些描述是正确的:( )
public class ThreadTest extends Thread {
public void run() {
System.out.println("In run");
yield();
System.out.println("Leaving run");
}
public static void main(String []argv) {
(new ThreadTest()).start();
}
}
选项如下(单选题):
A.程序运行输出只有In run
B.程序运行输出只有Leaving run
C.程序运行输出先有In run后有Leaving run
D.程序运行输出先有Leaving run后有In run
E.程序没有任何输出就退出了
F.程序将被挂起,只能强制退出
原因分析:
Thread.yield()方法作用是:暂停当前正在执行的线程对象,并执行其他线程。
这道题只有一个子线程对象,并没有多个子线程对象。所以跟yield()没有关系。
答案:c
错题6描述:
关于Java的一些概念,下面哪些描述是正确的:( )
A.所有的Java异常和错误的基类都是java.lang.Exception, 包括java.lang.RuntimeException
B.通过try … catch … finally语句,finally中的语句部分无论发生什么异常都会得到执行
c.java中所有的数据都是对象
D.Java通过垃圾回收回收不再引用的变量,垃圾回收时对象的finallize方法一定会得到执行
E.Java是跨平台的语言,无论通过哪个版本的Java编写的程序都能在所有的Java运行平台中运行
F.Java通过synchronized进行访问的同步,synchronized作用非静态成员方法和
静态成员方法上同步的目标是不同的
原因分析:
A.错误(Error)的基类是Throwable
C.基本类型不是对象
D.垃圾回收器并不总是工作,只有当内存资源告急时,垃圾回收器才会工作;即使垃圾回收器工作,finalize方法也不一定得到执行,这是由于程序中的其他线程的优先级远远高于执行finalize()函数线程的优先级。(这是楼下的答案)
E.低版本JRE无法运行高版本JRE
答案:B F
错题7描述:
有关finally语句块说法正确的是( )
A.不管catch是否捕获异常,finally语句块都是要被执行的
B.在try语句块或catch语句块中执行到System.exit(0)直接退出程序
C.finally块中的return语句会覆盖try块中的return返回
D.finally 语句块在 catch语句块中的return语句之前执行
原因分析::
D.不是return之前,是return执行完成之前,return表达式的结果会暂时保存起来,不会被改变,所以排除D
下面是总结:
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
关于第四点的验证:
运行结果:
答案:A B C