最详细的 Java 基础面试题汇总( 九 )

在以下 4 种特殊情况下 , finally 块不会被执行:

  1. 在 finally 语句块第一行发生了异常 。因为在其他行 , finally 块还是会得到执行
  2. 在前面的代码中用了 System.exit(int)已退出程序 。exit 是带参函数 ;若该语句在异常语句之后 , finally 会执行
  3. 程序所在的线程死亡 。
  4. 关闭 CPU 。
注意: 当 try 语句和 finally 语句中都有 return 语句时 , 在方法返回之前 , finally 语句的内容将被执行 , 并且 finally 语句的返回值将会覆盖原始的返回值 。 如下:
public static int f(int value) {try {return value * value;} finally {if (value =http://kandian.youth.cn/index/= 2) {return 0;}}}如果调用 f(2) , 返回值将是 0 , 因为 finally 语句的返回值覆盖了 try 语句块的返回值 。
33 Java 序列化中如果有些字段不想进行序列化 , 怎么办?对于不想进行序列化的变量 , 使用 transient 关键字修饰 。
transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时 , 被 transient 修饰的变量值不会被持久化和恢复 。 transient 只能修饰变量 , 不能修饰类和方法 。
34 获取用键盘输入常用的两种方法方法 1:通过 Scanner
Scanner input = new Scanner(System.in);String s= input.nextLine();input.close();方法 2:通过 BufferedReader
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));String s = input.readLine();35 Java 中 IO 流Java 中 IO 流分为几种?
  • 按照流的流向分 , 可以分为输入流和输出流;
  • 按照操作单元划分 , 可以划分为字节流和字符流;
  • 按照流的角色划分为节点流和处理流 。
Java Io 流共涉及 40 多个类 , 这些类看上去很杂乱 , 但实际上很有规则 , 而且彼此之间存在非常紧密的联系 ,Java I0 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的 。
  • InputStream/Reader: 所有的输入流的基类 , 前者是字节输入流 , 后者是字符输入流 。
  • OutputStream/Writer: 所有输出流的基类 , 前者是字节输出流 , 后者是字符输出流 。
按操作方式分类结构图:
最详细的 Java 基础面试题汇总文章插图
IO-操作方式分类
按操作对象分类结构图:
最详细的 Java 基础面试题汇总文章插图
IO-操作对象分类
既然有了字节流,为什么还要有字符流?问题本质想问:不管是文件读写还是网络发送接收 , 信息的最小存储单元都是字节 , 那为什么 I/O 流操作要分为字节流操作和字符流操作呢?
回答:字符流是由 Java 虚拟机将字节转换得到的 , 问题就出在这个过程还算是非常耗时 , 并且 , 如果我们不知道编码类型就很容易出现乱码问题 。 所以 ,I/O 流就干脆提供了一个直接操作字符的接口 , 方便我们平时对字符进行流操作 。 如果音频文件、图片等媒体文件用字节流比较好 , 如果涉及到字符的话使用字符流比较好 。
BIO,NIO,AIO 有什么区别?