java笔试练习题笔记(9)
对于Java中异常的描述正确的是( )
A.用throws定义了方法可能抛出的异常,那么调用此方法时一定会抛出此异常。
B.如果try块中没有抛出异常,finally块中的语句将不会被执行。
C.抛出异常意味着程序发生运行时错误,需要调试修改
D.Java中的非检测(unchecked)异常可能来自RuntimeException类或其子类。
答案解析:异常需要背会经常考(图片可能存在拼写错误建议百度查询)。
下面程序的运行结果:()
public static void main(String args[]) {
Thread t=new Thread(){
public void run(){
dianping();
}
};
t.start();
System.out.print("dazhong");
}
static void dianping(){
System.out.print("dianping");
}
A.dazhongdianping
B.dianpingdazhong
C.a和b都有可能
D.dianping循环输出,dazhong夹杂在中间
答案解析:由于线程调度是由操作系统控制的,且dianping
方法的执行时间可能非常短,因此两个线程的执行顺序是不确定的。dianping
可能会在dazhong
之前、之后或者两者交替执行。
若需要定义一个类,下列哪些修饰符是允许被使用的?( )
A.static
B.package
C.private
D.public
答案解析:牛客很多题目或者答案不严谨。
因为普通类也就是外部类,通过 eclipse 的警告“Illegal modifier for the class Test; only public, abstract & final are permitted” 可知只能用 public, abstract 和 final 修饰。
内部类则可以用 修饰成员变量的修饰符修饰内部类,比如 private, static, protected 修饰。
有关finally语句块说法正确的是( )
A.不管catch是否捕获异常,finally语句块都是要被执行的
B.在try语句块或catch语句块中执行到System.exit(0)直接退出程序
C.finally块中的return语句会覆盖try块中的return返回
D.finally 语句块在 catch语句块中的return语句之前执行
答案解析:经常考,需要记牢
1、不管有木有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
以下哪项陈述是正确的?
A.垃圾回收线程的优先级很高,以保证不再使用的内存将被及时回收
B.垃圾收集允许程序开发者明确指定释放哪一个对象
C.垃圾回收机制保证了JAVA程序不会出现内存溢出
D.进入”Dead”状态的线程将被垃圾回收器回收
E.以上都不对
答案解析: A: 垃圾回收在jvm中优先级相当相当低。 B:垃圾收集器(GC)程序开发者只能推荐JVM进行回收,但何时回收,回收哪些,程序员不能控制。 C:垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重BUG,照样内存溢出。 D:进入DEAD的线程,它还可以恢复,GC不会回收
下列哪一个方法你认为是新线程开始执行的点,也就是从该点开始线程n被执行。
A.public void start()
B.public void run()
C.public void int()
D.public static void main(String args[])
E.public void runnable()
答案解析:
start()方法是启动一个线程,此时的线程处于就绪状态,但并不一定就会执行,还需要等待CPU的调度。
run()方法才是线程获得CPU时间,开始执行的点。
以下关于final关键字说法错误的是()
A.final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性
B.final修饰的类不能被继承
C.final修饰的方法不能被重载
D.final修饰的变量不允许被再次赋值
答案解析:final修饰的类不能被继承
final修饰的方法不能被重写
final修饰的变量是常量,不能修改其值
AccessViolationException异常触发后,下列程序的输出结果为( )
static void Main(string[] args)
{
try
{
throw new AccessViolationException();
Console.WriteLine("error1");
}
catch (Exception e)
{
Console.WriteLine("error2");
}
Console.WriteLine("error3");
}
A.error2 B.error3 C.error2 D.error1
error3
答案解析:
情况一:出现异常,没有捕捉,那后面的代码就不会执行。
情况二:出现异常,catch捕捉成功,那后面的代码按顺序执行。
Web程序中,当前用户上下文信息应该保存在下面哪个对象中()
A.page
B.request
C.session
D.Application
答案解析:
JSP 四大作用域: page (作用范围最小)、request、session、application(作用范围最大)。 存储在application对象中的属性可以被同一个WEB应用程序中的所有Servlet和JSP页面访问。(属性作用范围最大) 存储在session对象中的属性可以被属于同一个会话(浏览器打开直到关闭称为一次会话,且在此期间会话不失效)的所有Servlet和JSP页面访问。 存储在request对象中的属性可以被属于同一个请求的所有Servlet和JSP页面访问(在有转发的情况下可以跨页面获取属性值),例如使用PageContext.forward和PageContext.include方法连接起来的多个Servlet和JSP页面。 存储在pageContext对象中的属性仅可以被当前JSP页面的当前响应过程中调用的各个组件访问,例如,正在响应当前请求的JSP页面和它调用的各个自定义标签类。
以下 b 的值是: byte b = (byte)129;
A.-126
B.-127
C.-128
D.-129
答案解析:
129 int类型(4个字节)二进制: 00000000 00000000 00000000 10000001
在计算机系统中,数值一律用补码来表示(存储),正数的补码和源码相同。
- int -> byte(1个字节),截取: 10000001
- 补码转反码:1开始则为负数,负数得到反码是末位-1: 10000000
- 负数的反码转原码(最高位即符号位不变):11111111
- 转换为十进制:-(27-1)=-127
public class Test
{
public int x;
public static void main(String []args)
{
System. out. println("Value is" + x);
}
}
对于上面这段代码,以下说法正确的是:
A.程序会打出 "Value is 0"
B.程序会抛出 NullPointerException
C.非静态变量不能够被静态方法引用
D.编译器会抛出 "possible reference before assignment"的错误
答案解析:当类加载时,static静态方法随着类加载而初始化,此时实例对象还未被创建,但是非静态成员变量需要等到实例对象创建才会被初始化,故无法被引用。
如果一个接口Cow有个public方法drink(),有个类Calf实现接口Cow,则在类Calf中正确的是? ( )
A.void drink() { …}
B.protected void drink() { …}
C.public void drink() { …}
D.以上语句都可以用在类Calf中
答案解析:子类重写父类方法时,方法的访问权限不能小于原访问权限,在接口中,方法的默认权限就是public,所以子类重写后只能是public。
给定以下JAVA代码,这段代码运行后输出的结果是()
public class Test
{
public static int aMethod(int i)throws Exception
{
try{
return i/10;
}
catch (Exception ex)
{
throw new Exception("exception in a aMethod");
}finally{
System.out.printf("finally");
}
}
public static void main(String[] args){
try
{
aMethod(0);
}
catch (Exception ex)
{
System.out.printf("exception in main");
}
System.out.printf("finished");
}
}
A.exception in main finished
B.finallyfinished
C.exception in main finally
D.finally exception in main finally
答案解析:0在下面才是错误的,千万注意。
1、先进入main函数,进入try块调用aMethod(0)方法;
2、执行aMethod()方法的try块,i/10可以正确执行,故并未抛出异常,catch块不执行,而需要执行finally(该块任何时候都要执行),故打印finally;
3、回到main函数,由于aMethod()调用成功,因此main函数的catch块同样不执行,顺序执行finally块,打印finished。
A.true,false,true
B.false,true,false
C.true,true,false
D.false,false,true
答案解析:若题中代码改为 Integer i5 = new Integer(100);Integer i6 = new Integer(100); 则i5==i6 结果为false,因为两个对象之间比较并不会自动拆箱,所以==比的是对象的引用地址,故不相等。而原来题目中相等是因为当自动装箱时,JVM会优化,出于节省内存的考虑,JVM会缓存-128到127的Integer对象,所以当自动装箱的数值在这区间时,所装箱的结果都是对缓存池中同一个对象的引用,故==比较地址会为true。
下列正确的有()
A.call by value不会改变实际参数的数值
B.call by reference能改变实际参数的参考地址
C.call by reference不能改变实际参数的参考地址
D.call by reference能改变实际参数的内容
答案解析:call by value(值传递),call by reference(引用传递)。值传递和引用传递参数的调用。 值传递是将变量的一个副本传递到方法中,方法中如何操作该变量副本,都不会改变原变量的值。 引用传递是将变量的内存地址传递给方法,方法操作变量时会找到保存在该地址的变量,对其进行操作。会对原变量造成影响。
以下程序的运行结果是()
public class Increment
{
public static void main(String args[])
{
int a;
a = 6;
System.out.print(a);
System.out.print(a++);
System.out.print(a);
}
}
A.666
B.667
C.677
D.676
答案解析:a++可以理解为当访问a之后再对a进行加一操作。
有变量int i = 0; int a = i++; int b = ++a; int c = a+b; int d = (a == 1)?b:c; 请问a和d的值分别是多少?( )。
A.2,4
B.1, 4
C.1, 2
D.1,1
答案解析:虽然简单容易出错
int i = 0; //i=0
int a = i++; //a=i,a=0,i++,i=1
int b = ++a; //a++,a=1,b=a,b=1
int c = a+b;//c=2
int d = (a == 1)?b:c;//a==1,d=b,d=1
在jdk1.5之后,下列 java 程序输出结果为______。
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
A.true,false
B.true,true
C.false,true
D.false,false
E.对于不同的环境结果不同
F.程序无法执行
答案解析:int类型与Integer进行比较,Integer会自动拆箱成Int类型再比较(1.5以前没有自动装箱拆箱)
下面程序段执行完成后,则变量sum的值是( )。
int b[][]={{1}, {2, 2}, {2, 2, 2}};
int sum = 0;
for(int i = 0; i < b.length; i++) {
for(int j = 0; j < b[i].length; j++) {
sum += b[i][j];
}
}
A.32
B.11
C.2
D.3
答案解析:二维数组的遍历,即每个元素之和
1
2 3
4 5 6
不考虑反射,String类型变量所指向内存空间中的内容是不能被改变的 。 ( )
A.正确
B.错误
答案解析:String类是不可改变的,实质String对象内容不可变,String对象存在于常量池中,而String引用是可以改变的,可以赋予新的对象字符串
在运行时,由java解释器自动引入,而不用import语句引入的包是()。
A.java.lang
B.java.system
C.java.io
D.java.util
答案解析:A java.lang包是java语言的核心包,lang是language的缩写 java.lang包定义了一些基本的类型,包括Integer,String之类的,是java程序必备的包,有解释器自动引入,无需手动导入
以下哪项不属于java类加载过程?
A.生成java.lang.Class对象
B.int类型对象成员变量赋予默认值
C.执行static块代码
D.类方法解析
答案解析:对象成员,那么肯定在实例化对象后才有。在类加载的时候会赋予初值的是类变量,而非对象成员
jre 判断程序是否执行结束的标准是()
A.所有的前台线程执行完毕
B.所有的后台线程执行完毕
C.所有的线程执行完毕
D.和以上都无关
答案解析:后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。 前台线程:是指接受后台线程服务的线程,后台线程则是java中所有前台结束后结束,不管有没有完成。
以下代码输出的是:
public class SendValue{
public String str="6";
public static void main(String[] args) {
SendValue sv=new SendValue();
sv.change(sv.str);
System.out.println(sv.str);
}
public void change(String str) {
str="10";
}
}
A.6
B.10
C.都不对
D.16
答案解析:String虽然是引用类型,但是是不可变的。
给定includel.isp文件代码片段,如下:
<% pageContext.setAttribute(“User”,”HAHA”);%>
______ // 此处填写代码
给定include2.jsp文件代码片段如下:
<%=pageContext.getAttribute(“User”)%>
要求运行include1.jsp时,浏览器上输出:HAHA
A.<jsp:include page=”include2.jsp” flash=”true”>
B.<%@include file=”include2.jsp”%>
C.<jsp:forward page=”include2.jsp”>
D.<% response.sendRedirect(“include2.jsp”); %>
答案解析:
A选项使用了jsp中动作标签的包含标签,这里是动态包含。原理是包含与被包含的页面单独翻译成不同的java文件,然后运行时合并在一起。因为是存在域中的数据,故刚开始就直接翻译数据还不存在,因此浏览器上不能显示出HAHA。
B选项使用了jsp三大指令中的包含指令,这里是静态包含。原理是直接把包含与被包含页面的内容先合并在一起,然后翻译成一个java源文件,最后编译执行。故可以在浏览器上显示出HAHA。
C和D选项分别使用了跳转和重定向,我们知道jsp中有四个域对象,从小到大分别为:
- page域:在同一个jsp页面中数据有效
- request域:在同一个请求中数据有效
- session域:在用一个会话中数据有效
- application域:在同一个网站中数据有效
题中使用的是page域对象:pageContext,而C选项应该使用request域对象:HttpServletRequest,而D选项应该至少使用session域对象:HttpSession(如果处于同一会话中)
关于Java以下描述正确的有( )
A.Class类是Object类的超类
B.Object类是一个final类
C.String类是一个final类
D.Class类可以装载其它类
答案解析:
Object类是所有类的父类,所以Object类不能用final修饰(因为被final修饰的类不能被继承)。
String类是一个不变类,只有String是不可变的,才实现字符串常量池,节省空间,提高效率,同一个字符串常量被多个线程共享,实现线程安全。
以下选项中,switch语句判断条件可以接受的数据类型有哪些?(多选)
A.int
B.byte
C.char
D.short
答案解析:
-
基本数据类型和包装类:
switch
语句可以支持byte
、short
、char
、int
这些基本数据类型,以及它们的包装类Byte
、Short
、Character
、Integer
。 -
自动拆箱:从JDK 1.5开始,
switch
语句支持自动拆箱,这意味着可以直接使用包装类而不需要显式地调用intValue()
等方法来获取基本类型。 -
类型转换:
byte
、short
、char
在switch
语句中会被自动提升(widening)为int
类型,因为它们都可以无损失地转换为int
。 -
枚举类型:枚举类型(
enum
)也可以作为switch
语句的参数。枚举类型的每个实例在编译时会被分配一个从0开始的整数值,这个值可以通过ordinal()
方法获取,因此枚举类型可以被用于switch
语句中。 -
字符串类型:从JDK 1.7开始,
switch
语句支持字符串(String
)类型的参数。这是通过在switch
语句中使用字符串的hashCode()
方法来实现的,hashCode()
方法返回一个int
类型的哈希码。