参考博文:Java基础常见面试题总结(下) | JavaGuide
目录
参考博文:Java基础常见面试题总结(下) | JavaGuide
异常
error和Exception区别
- error是在程序运行过程中产生的错误,程序本身无法处理,在遇到这些操作时,一般虚拟机会终止运行。Java 虚拟机运行错误(Virtual MachineError)、虚拟机内存不够错误(OutOfMemoryError)、类定义错误(NoClassDefFoundError
- Exception是指程序可以处理的错误,能够通过try-catch异常捕获。
Throwable 类常用方法
- String getMessage(): 返回异常发生时的简要描述
- String toString(): 返回异常发生时的详细信息
- String getLocalizedMessage(): 返回异常对象的本地化信息。使用 Throwable 的子类覆盖这个方法,可以生成本地化信息。如果子类没有覆盖该方法,则该方法返回的信息与 getMessage()返回的结果相同
- void printStackTrace(): 在控制台上打印 Throwable 对象封装的异常信息
try-catch-finally
- try用于捕获异常
- catch用于处理异常
- finally,无论是否捕获的异常,finally代码块都会执行
!注意不要再finally语句块中使用return,如果在catch语句块中也有return语句,那么程序在执行的时候,会先将catch语句块中的return语句先暂存起来,然后执行finally语句块,这样会造成在finally语句块中直接执行return语句。
什么时候finally中的代码不会被执行
当程序运行到finally语句之前,虚拟机就因为停止运行时。
什么情况下,虚拟机会停止运行?
- CPU的退出
- 程序所在线程死亡
try-with-resources
适用范围(资源的定义): 任何实现 java.lang.AutoCloseable或者 java.io.Closeable 的对象
关闭资源和 finally 块的执行顺序: 在 try-with-resources 语句中,任何 catch 或 finally 块在声明的资源关闭后运行
resources关闭资源
try (Scanner scanner = new Scanner(new File("test.txt"))) {
while (scanner.hasNext()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException fnfe) {
fnfe.printStackTrace();
}
也可以同时关闭多个资源,只需要在()里面用逗号分割
使用异常时,需要注意什么
- 在抛出异常时,需要抛出具体的异常,而不是它的父类
- 不能把异常定义为静态变量,这样会导致异常栈信息混乱
- 使用日志打印异常之后就不要再抛出异常了(两者不要同时存在一段代码逻辑中)。
泛型
使用泛型可以对传入对象进行判断,且指定对象类型传入
ArrayList<Integer> list = new ArrayList<>();
泛型的使用方式
泛型类,泛型方法,泛型接口
泛型类
public class A<T>{
private T key;
public A(T key) {
this.key = key;
}
public T getKey(){
return key;
}
}
泛型接口
public interface B<T> {
public T method();
}
泛型方法
public static < E > void printArray( E[] inputArray )
{
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
反射
通过反射可以调用一个类的所有属性和方法
优缺点:
优:让我们的代码更加灵活
缺:我们可以获取一个类的所有属性方法,增加了安全性问题,比如无视泛型安全检查
在框架中多数使用动态代理,动态代理使用反射。注解也使用了反射
注解
解析方式
- 在编译时期扫描。扫描相应代码注解并处理
- 在运行时扫描。如spring框架中的@Value等注解
序列化 反序列化
序列化:需要将Java对象持久化,例如保存在Java文件中。或者在网络中传递Java对象
- 序列化:将数据结构或者对象转成二进制字节流
- 反序列化:将序列化生成的二进制字节流转换成数据结构或者对象
不想序列化怎么办
transient关键字可以阻止序列化,但是有几点需要注意
- 不能用来修饰类和方法,直能修饰变量
- 被修饰的基本变量在反序列化之后都会变成未被初始化的默认值
- static 变量因为不属于任何对象(Object),所以无论有没有 transient 关键字修饰,均不会被序列化。