2021年09月01日 java

考点1:try-catch-finally执行流程

分析以下代码,说法正确的是()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
System.out.println(val());
}
public static int val() {
int num = 5;
try {
num = num / 0;
} catch (Exception e) {
num = 10;
} finally {
num = 15;
}
return num;
}
  • A 运行时报错
  • B 程序正常运行,输出值为5
  • C 程序正常运行,输出值为10
  • D 程序正常运行,输出值为15

解析

显示答案/隐藏答案正确答案: D

第7行出现除零异常,然后执行catch块,最后执行finally块。

考点2:数据类型

若所用变量都已正确定义,以下选项中,非法的表达式是()

  • A a!= 4||b==1
  • B 'a' % 3
  • C 'a' = 1/3
  • D 'A' + 32

解析

显示答案/隐藏答案正确答案: C

‘a’是个常数,不能赋值

考点3:自动类型提升

若有定义语句: int a=10 ; double b=3.14 ; 则表达式 ‘A’+a+b 值的类型是()

  • A char
  • B int
  • C double
  • D float

解析

显示答案/隐藏答案正确答案: C

类型自动提升

char < short < int < float < double不同类型运算结果类型向右边靠齐。
类型大的与类型小的进行运算,强制转换为大类型
自动转换,精度小的自动转换为精度大的 因此统一转换为double类型。如果是要精度大的转化为精度小的 则需要进行强制类型转换

考点4:检查异常和非检查异常

下列哪种异常是检查型异常,需要在编写程序时声明?

  • A NullPointerException
  • B ClassCastException
  • C FileNotFoundException
  • D IndexOutOfBoundsException

解析

显示答案/隐藏答案正确答案: C

java中的异常通常分为编译时异常和运行异常。编译时异常需要我们手动的进行捕捉处理,也就是我们用try….catch块进行捕捉处理。
对于运行时异常只有在编译器在编译运行时才会出现,这些不需要我们手动进行处理。对于A、
B、 D来说都是运行时异常,因此答案为C

Java异常族谱

214250_1444467985224_6A144C1382BBEF1BE30E9B91BC2973C8

  1. 粉红色的是受检查的异常(checked exceptions),其必须被try{}catch语句块所捕获,或者在方法签名里通过throws子句声明.受检查的异常必须在编译时被捕捉处理,命名为 Checked Exception 是因为Java编译器要进行检查,Java虚拟机也要进行检查,以确保这个规则得到遵守.
  2. 绿色的异常是运行时异常(runtime exceptions),需要程序员自己分析代码决定是否捕获和处理,比如空指针,被0除…
  3. 而声明为Error的,则属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,Error不需要捕捉。

Java异常

  • 检查型异常(编译时异常 checked exceptions)
  • 需要在编写程序时声明
  • 需要我们手动的进行捕捉处理,也就是我们用try….catch块进行捕捉处理。或者在方法签名里通过throws子句声明
  • Throwable、Exception、IOException、ClassNotFoundException、CloneNotSupportedException、EOFException、FileNotFoundException、MalformedURLException、UnknownHostException
  • 运行异常(runtime exceptions)
  • 只有在编译器在编译运行时才会出现,这些不需要我们手动进行处理
  • 需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被0除…
  • RuntimeException、ArithmeticException、ClassCastException、IllegalArgumentException、IllegalStateException、IndexOutOfBoundsException、NoSuchElementException、NullPointerException
  • Error
  • 属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,Error不需要捕捉。

1、Java 基本上除了 File、SQL 相关的异常外,都是运行时异常

考点5:Object方法

以下 _____ 不是 Object 类的方法

  • A clone()
  • B finalize()
  • C toString()
  • D hasNext()

解析

显示答案/隐藏答案正确答案: D

这种类型的题一般考察点有两个:
1.Object中没有hasNext() 方式,这个方法是迭代器中的
2.Object没有copy方法,但是有clone()方法, 用于创建并返回该对象的一个副本

hasNext一般为迭代器方法

hasNext() 一般是迭代器(Iterater)的方法,表示是否存在下一个元素,用next()方法取到下一个元素。

Object方法

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html

java.lang.Object方法 描述
protected Object clone() Creates and returns a copy of this object.
boolean equals(Object obj) Indicates whether some other object is “equal to” this one.
protected void finalize() Deprecated. The finalization mechanism is inherently problematic.
Class<?> getClass() Returns the runtime class of this Object.
int hashCode() Returns a hash code value for the object.
void notify() Wakes up a single thread that is waiting on this object’s monitor.
void notifyAll() Wakes up all threads that are waiting on this object’s monitor.
String toString() Returns a string representation of the object.
void wait() Causes the current thread to wait until it is awakened, typically by being notified or interrupted.
void wait(long timeoutMillis) Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed.
void wait(long timeoutMillis, int nanos) Causes the current thread to wait until it is awakened, typically by being notified or interrupted, or until a certain amount of real time has elapsed.

考点6:值传递引用传递问题

指出下来程序运行的结果是

4819419_1512815363858_050A1C016A89DF3247F32E71DC8461D3

  • A good and abc
  • B good and gbc
  • C tst ok and abc
  • D tst ok and gbc

解析

显示答案/隐藏答案正确答案: B

值传递和引用传递

  • 基本数据类型都是值传递
  • 类,数组,接口是引用传递。 由于String对象本身的特殊性,导致它值传递的特征

考点7:abstract和final

关于抽象类与最终类,下列说法错误的是?

  • A 抽象类能被继承,最终类只能被实例化。
  • B 抽象类和最终类都可以被声明使用
  • C 抽象类中可以没有抽象方法,最终类中可以没有最终方法
  • D 抽象类和最终类被继承时,方法可以被子类覆盖

解析

显示答案/隐藏答案正确答案: D

最终类就是被final修饰的类,最终方法就是被final修饰的方法。最终类不能被继承,最终方法不能被重写。

1,抽象类中可以有抽象方法,也可以没有抽象方法。
2,抽象类当然可以被继承,因为它就是用来继承的,
3,继承抽象类,若有抽象方法,则子类必须将其抽象方法实现,
4,抽象类中的非抽象方法可以被重写。

最终类和抽象类正好相反
5,加上final的类就叫最终类,加上final的方法就叫最终方法,
6,最终类中可以有最终方法也可以没有
7,最终类不能有子类,最终方法不能被重写

抽象类和最终类的区别

1.抽象类可以被继承,并且触创建抽象类就是为了被继承,但是最终类只能实例化;
2.抽象类和最终类都可以被声明使用。
3.抽象类可以没有抽象方法,最终类中可以没有最终方法。
4.最终类不能被继承,子类继承非最终类时,子类可以继承该类的最终方法,但不能重写父类的最终方法。
5.抽象类是不能实例化的,实例化必将加载类,然后根本不知道抽象方法的方法体大小,所以不能实例化。

然后是抽象类和接口的区别

类中只要含有一个抽象方法,该类就是抽象类;抽象类中可以包含一个或多个抽象方法,也可以不含有抽象方法,直接在类声明时候加上abstract
,该类就是抽象类,但是这种情况没有意义。

Java7之前接口中的方法只有声明,没有实现,类似抽象方法,

接口方法默认public abstract修饰;
接口中的变量默认是public static final修饰的;

接口定义时候,如果不声明为public的接口,那么该接口只有包访问权限。

一个子类只能继承一个抽象类(虚类),但能实现多个接口;
一个抽象类可以有构造方法,接口没有构造方法;
一个抽象类中的方法不一定是抽象方法,即其中的方法可以有实现(有方法体),
接口中的方法都是抽象方法,不能有方法体,只有声明;

一个抽象类可以是public、private、protected、default,
接口只有public;

一个抽象类中的方法可以是public、private、protected、default
接口中的方法只能是public和default。

考点8:异常处理

对于Java中异常的描述正确的是( )

  • A 用throws定义了方法可能抛出的异常,那么调用此方法时一定会抛出此异常。
  • B 如果try块中没有抛出异常,finally块中的语句将不会被执行。
  • C 抛出异常意味着程序发生运行时错误,需要调试修改
  • D Java中的可不检测(unchecked)异常可能来自RuntimeException类或其子类。

解析

显示答案/隐藏答案正确答案: D

A错 在调用此方法的时候 也可以再次申明以将异常交由更高一级处理。
B错 finally块中的语句一定会被执行。除非catch块中有System.exit(0)
C错 抛出异常不一定是运行时异常,也有可能是编译时异常。
D对 运行时异常的特点是Java编译器不会检查它。

Exception(异常)

是程序本身可以处理的异常。主要包含RuntimeException等运行时异常和IOException,SQLException等非运行时异常。

运行时异常

包括:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

编译器不会检查运行时异常

运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

非运行时异常(编译异常)

包括:RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常

考点9:线程安全的集合

下面哪些具体实现类可以用于存储键,值对,并且方法调用提供了基本的多线程安全支持:()

  • A java.util.ConcurrentHashMap
  • B java.util.Map
  • C java.util.TreeMap
  • D java.util.SortMap
  • E java.util.Hashtable
  • F java.util.HashMap

解析

显示答案/隐藏答案正确答案: AE

Hashtable线程安全

Hashtable的方法都是synchrnized修饰的,所以线程安全.

java.util.Hashtable.java
1
2
3
4
5
6
7
8
......
public synchronized int size() {...}
public synchronized boolean contains(Object value) {...}
public synchronized boolean containsKey(Object key) {...}
public synchronized V get(Object key) {...}
public synchronized V put(K key, V value) {...}
public synchronized V remove(Object key) {...}
......

ConcurrentXxx线程安全

ConcurrentHashMap并发容器,JDK7采用分段锁,JDK8采用CAS算法,线程安全,建议使用,

https://blog.csdn.net/xuefeng0707/article/details/40834595
https://www.jianshu.com/p/863542dcbd5b

Connections.synchrnizedMap(map)非线程安全的Map包装成线程安全的Map

Connections工具类提供了一个方法synchrnizedMap可以把Map同步,本质就是给每一个方法加上synchrnized关键字进行同步

考点10:Servlet族谱

下面有关servlet的层级结构和常用的类,说法正确的有?

  • A GenericServlet类:抽象类,定义一个通用的、独立于底层协议的Servlet
  • B 大多数Servlet通过从GenericServletHttpServlet类进行扩展来实现
  • C ServletConfig接口定义了在Servlet初始化的过程中由Servlet容器传递给Servlet得配置信息对象
  • D HttpServletRequest接口扩展ServletRequest接口,为HTTP Servlet提供HTTP请求信息

解析

显示答案/隐藏答案正确答案: ABCD

1562929_1495091266467_AA89EDF1B0D43CAA9A893C73A1615398

GenericServlet抽象类

GenericServlet是个抽象类,必须给出子类才能实例化。它给出了设计servlet的一些骨架,定义了servlet生命周期,还有一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的,也就是说 你有可能用非http协议实现它。

HttpServlet

HttpServlet是GenericServlet的子类,当然就具有GenericServlet的一切特性,还添加了doGet, doPost, doDelete,doPut, doTrace等方法对应处理http协议里的命令的请求响应过程。

一般没有特殊需要,自己写的Servlet都扩展HttpServlet 。