2021/8/20错题

场景:

今天错好多道题,人都傻掉了

错题

错题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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

关于我成为程序员这档事

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值