自学内容网 自学内容网

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

在计算机系统中,数值一律用补码来表示(存储),正数的补码和源码相同

  1. int -> byte(1个字节),截取: 10000001
  2. 补码转反码:1开始则为负数,负数得到反码是末位-1: 10000000
  3. 负数的反码转原码(最高位即符号位不变):11111111
  4. 转换为十进制:-(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

答案解析:

  1. 基本数据类型和包装类switch语句可以支持byteshortcharint这些基本数据类型,以及它们的包装类ByteShortCharacterInteger

  2. 自动拆箱:从JDK 1.5开始,switch语句支持自动拆箱,这意味着可以直接使用包装类而不需要显式地调用intValue()等方法来获取基本类型。

  3. 类型转换byteshortcharswitch语句中会被自动提升(widening)为int类型,因为它们都可以无损失地转换为int

  4. 枚举类型:枚举类型(enum)也可以作为switch语句的参数。枚举类型的每个实例在编译时会被分配一个从0开始的整数值,这个值可以通过ordinal()方法获取,因此枚举类型可以被用于switch语句中。

  5. 字符串类型:从JDK 1.7开始,switch语句支持字符串(String)类型的参数。这是通过在switch语句中使用字符串的hashCode()方法来实现的,hashCode()方法返回一个int类型的哈希码。


原文地址:https://blog.csdn.net/weixin_62526393/article/details/143737487

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!