Java基础面试题(8)
106.请说一下递归的概念(*)?
递归是计算机的重要概念,就是在过程或函数里调用自身,以达到能使程序更加简洁、清晰。
107.什么是异常处理机制(*)?
异常处理机制能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。
108.异常对象的生成的两种方式(*)?
由虚拟机自动生成:程序运行过程中,虚拟机检测到程序发生了问题,如果在当前代码中没有找到相应的处理程序,就会在后台自动创建一个对应异常类的实例对象并抛出——自动抛出。
由开发人员手动创建:Exception exception = new ClassCastException();——创建 好的异常对象不抛出对程序没有任何影响,和创建一个普通对象一样。
109.异常的抛出机制(*)?
如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处理。
如果异常没有在调用者方法中处理,它继续被抛给这个调用方法的上层方法。这个过程将一直继续下去,直到异常被处理。
这一过程称为捕获(catch)异常。 如果一个异常回到 main()方法,并且 main()也不处理,则程序运行终止。
110.异常体系结构?
Java 标准库内建了一些通用的异常,这些类以 Throwable 为顶层父类。 Throwable 又派生出 Error 类和 Exception 类。
错误:Error 类以及它的子类的实例,代表了 JVM 本身的错误。错误不能被程序员通过代码处理,Error 很少出现。因此,程序员应该关注 Exception 为父类的分支下的各种异常类。
异常:Exception 以及它的子类,代表程序运行时发生的各种不期望发生的事件。可以被 Java 异常处理机制使用,是异常处理的核心。
111.Error 和 Exception 的区别(***)?
Error 和 Exception 都有一个共同的根类是 Throwable 类。
Error 是系统中的错误,程序员是不能改变的和处理的,一般是指与虚拟机相关的问题, 对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误, 建议让程序终止。因此我们编写程序时不需要关心这类错误。
Exception,也就是我们经常见到的一些异常情况,表示程序可以处理的异常,可以捕 获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止 异常。
112.Java 异常的分类(*)?
Java 的异常从广义上分为检查异常(checked exceptions)和非检查的异常(unchecked exceptions)。
检查异常: 编译器要求你必须处置的异常。也就是说,你代码还没运行呢,编译器 就会检查你的代码,会不会出现异常,要求你对可能出现的异常必须做出相应的处理。
非检查异常:编译器不要求强制处置的异常,虽然你有可能出现错误,但是编译器不会在编译的时候检查。
Java 的异常从狭义上分为运行时异常和编译期异常。
运行时异常:是 RuntimeException 类及其子类异常,这些异常是非检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该 从逻辑角度尽可能避免这类异常的发生。
编译期异常:是 RuntimeException 以外的异常,类型上都属于 Exception 类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
检查异常 = 编译期异常;非检查异常 = 运行时异常 + Error;
113.常见的异常有哪些?
java.lang.RuntimeException: 运行时异常
ClassCastException: 类类型转换异常,当试图将对象强制转换为不是实例的子类时, 抛出该异常;
ArrayIndexOutOfBoundsException: 数组下标越界异常,当你使用不合法的索引访问数 组时会抛出该异常;
NullPointerException: 空指针异常,通过 null 进行方法和属性调用会抛出该异常;
ArithmeticException: 算术运算异常,除数为 0,抛出该异常;
NumberFormatException: 数字转换异常,当试图将一个 String 转换为指定的数字类 型,而该字符串确不满足数字类型要求的格式时,抛出该异常;
InputMismatchException: 输入不匹配异常,输入的值数据类型与设置的值数据类型不 能匹配。
java 编译时异常:
SQLException: SQL 异常,提供有关数据库访问错误或其他错误的信息的异常;
IOExeption: 输入输出异常,表示发送了某种 I/O 异常的信号。
FileNotFoundException: 文件找不到异常,通常是两种情况:1、系统找不到指定的路 径 2、拒绝访问(指定的是目录时,就会报拒绝访问异常)
EOFException: 文件已结束异常,抛出 EOFException 一定是因为连接断了还在继续 read;
java.lang.ClassNotFoundException: 类找不到异常
当我们通过配置文件去查找一个 类的时候,如果配置路径写错,就会抛出该异常,比如:web.xml 文件中根本就不存在该类 的配置或者配置的路径写错;(比较常见)
114.try...catch...finally 的作用(***)?
try 块中放可能发生异常的代码。
catch 块用于捕获并处理一个特定的异常,catch 块可以有多个;
finally 块无论异常是否发生,异常是否匹配被处理,都会执行,主要做一些清理工作, 比如释放资源; try 必须有,catch 和 finally 都是可选的;但是 try 不能单独存在,至少要和 catch 或 finally 其中一个结合使用;
115.try...catch...finally 和 throws 处理异常的区别(*)?
try...catch...finally 是在方法内部处理异常,通过统一的异常处理方案;
throws 是方法本身不知道如何处理这样的异常,或者说让调用者处理更好,调用者需要 为可能发生的异常负责。
116.throws 和 throw 的区别(***)?
throws 定义在方法的声明中,表示调用该方法可能出现一个或多个异常,由该方法的调用者来处理;throws 后面跟的是一个或多个异常类型,让它的使用者知道需要捕获的异常的类型; throws 表示出现异常的一种可能性,并不一定会发生这种异常。
throw 定义在方法内部,表示方法体内,表示抛出异常,由方法体内的语句处理;throw 是 具体向外抛出异常的动作,该语句的后面必须是一个异常对象; 执行 throw 一定抛出了某种异常。
两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。
117.什么是异常链化(*)?
异常的链化可以将多个模块的异常串联起来,使得异常信息不会丢失。实现方式:以一个异常对象为参数构造新的异常对象。
118.finally 和 return 代码阅读面试题(***) 规则?
在 try 块中即便有 return,break,continue 等改变执行流的语句,finally 也会执行。
finally 中的 return 会覆盖 try 或者 catch 中的返回值。
finally 中的 return 会抑制(消灭)前面 try 或者 catch 块中的异常 finally 中的异常会覆盖(消灭)前面 try 或者 catch 中的异常
119.finally 的使用注意事项(***)?
不要在 finally 中使用 return。
不要在 finally 中抛出异常。
减轻 finally 的任务,不要在 finally 中做一些其它的事情,finally 块仅仅用来释放资源是最合适的。 尽量将所有的 return 写在函数的最后面,而不是 try ... catch ... finally 中。
120.final,finally 和 finalize 的比较(***)?
final 修饰类,类不能被继承;final 修饰方法,方法不能被重写;final 修饰变量,变 量不能被修改。
finally 是异常语句块的一部分,无论是否有异常,都会被执行。
finalize 是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此 方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。