前 30 名异常处理面试问题和答案 [针对应届生和有经验者]
已发表: 2020-09-29异常处理是在算法中实现的一个概念,用于处理可能的运行时错误,这可能会破坏程序的正常流程。 可以使用此概念处理的一些错误是:
- ClassNotFoundException
- IO异常
- SQL异常
- 远程异常
- 运行时异常:
- 算术异常
- 空指针异常
- NumberFormatException
- IndexOutOfBoundsException
- ArrayIndexOutOfBoundsException
- StringIndexOutOfBoundsException
这种实现的优点是,如果在执行程序时出现异常,可以防止程序崩溃。 如果没有异常处理,程序遇到异常就会抛出错误,程序的其余部分不会被执行。 但是,实现此概念将提供一种解决方法,其中如果程序的其余部分独立于发生的异常,则它们将被执行。 要了解更多信息,请查看我们的数据科学课程。
阅读:必读 30 个 Selenium 面试问答:终极指南
异常处理面试问答
1. 例外是什么意思?
这是执行程序时有时会遇到的异常情况。 它破坏了程序的正常流程。 有必要处理这个异常; 否则,可能会导致程序突然终止。
2. 解释如何在 Java 中处理异常。 流程背后的异常处理机制是什么?

异常处理机制分为三个部分。 这些被称为:
- 尝试块:首先尝试执行并监视可能发生的任何异常的代码部分。
- Catch 块:如果 'try' 块抛出任何异常,它会被此代码段捕获。
- finally 块:无论在“try”块中捕获的异常(如果有),都始终执行此部分下的代码。 即使没有异常,该块下的代码也会被执行。
3. 是否可以在“try”、“catch”和“finally”块之间保留其他语句?
不建议在各部分之间包含任何语句 “try”、“catch”和“finally”块,因为它们构成了异常处理机制的一个完整单元。
尝试
{
//监控异常的代码。
}
//这里不能保留语句
捕捉(异常前)
{
//捕获try块抛出的异常,如果有的话。
}
//这里不能保留语句
最后
{
//不管有什么异常,这个块总是被执行。
}
4. 是否可以只包含一个 'try' 块而没有 'catch' 和 'finally' 块?
这会产生编译错误。 'try' 块后面必须跟一个 'catch' 块或一个 'finally' 块,如果不是两者都有的话。 需要 'catch' 或 'finally' 块之一,以便异常处理流程不会中断。
5. 如果控件从 finally 块本身返回,是否可以保留“finally”块之后的语句?
这将导致无法访问的 catch 块错误。 这是因为控件将从“finally”块本身返回。 在出现异常的行之后,编译器将无法执行代码。 这就是为什么执行会显示无法访问的代码错误。
梦想出国留学? 这是适合您的程序6. 解释一个无法到达的 catch 块错误。
在多个catch块的情况下,catch块的放置顺序是从最具体到最一般的。 也就是说,应该先出现异常的子类,然后才是超类。 如果先保留超类,后保留子类,编译器将显示无法访问的 catch 块错误。
公共类异常处理
{
公共静态无效主要(字符串 [] 参数)
{
尝试
{
int i = Integer.parseInt(“测试”);
//此语句将抛出 NumberFormatException //因为给定的输入是字符串,而 //指定的格式是整数。
}
捕捉(异常前)
{
System.out.println(“这个块处理所有异常类型”);
//各种异常都可以在这个 //block 中处理,因为它是异常的超类。
}
捕获(NumberFormatException 前)
{
//这将给出编译时错误
//这个块将变得不可访问,因为
//异常已经被上面的 //catch 块捕获
}
}
}
7. 考虑“try”块中的三个语句:statement1、statement2 和 statement3。 后面是一个“catch”块,用于捕获在“try”块执行期间发生的异常。 假设在 statement2 处抛出异常。 你认为statement3会被执行吗?
Statement3 将不会被执行。 如果'try'块在任何时候抛出异常,异常之后的剩余代码将不会被执行。 相反,流控制将直接进入“catch”块。
8.区分Java中的错误和异常。
错误和异常之间的主要区别在于,虽然错误是由 JVM(Java 虚拟机)运行的环境引起的,但异常是由程序本身引起的。 例如,OutOfMemory 是 JVM 耗尽其内存时发生的错误。
但是,NullPointerException 是程序尝试访问空对象时遇到的异常。 无法从错误中恢复。 因此,错误的唯一解决方案是终止执行。 但是,可以使用 try 和 catch 块或通过将异常抛出回调用者函数来解决异常。
必读: Java 面试问答
9. 异常有哪些类型? 解释他们。
有两种类型的异常:
检查异常
编译器已知和识别的异常类型。 这些异常只能在编译时检查。 因此,它们也被称为编译时异常。 这些可以通过使用 try 和 catch 块或使用 throw 子句来处理。 如果这些异常处理不当,就会产生编译时错误。 示例包括 java.lang.Exception 的子类,但 RunTimeException 除外。
未经检查的异常
编译器无法识别的异常类型。 它们仅在运行时发生。 因此,它们也被称为运行时异常。 在编译时不会检查它们。 因此,即使在成功编译之后,如果处理不当,它们也会导致程序过早终止。 示例包括 java.lang.RunTimeException 和 java.lang.Error 的子类。
10. Java中异常的层次结构是什么?
java.lang.Throwable 是 Java 中所有错误和异常的超类。 该类扩展了 java.lang.Object 类。 catch 块的参数只能是它的类型或它的子类类型。 Throwable 类包括两个子类:
- java.lang.Error :这是 Java 中所有错误类型的超类。 其中包括的常见错误是 -
- java.lang.VirtualMachineError:在此之下 –
- 堆栈溢出错误
- 内存不足错误
- java.lang.AssertionError
- java.lang.LinkageError:在这个下——
- NoClassDefFoundError
- 不兼容的ClassChangeError
- java.lang.VirtualMachineError:在此之下 –
- java.lang.Exception:这是Java中所有异常类型的超类。 常见的例外情况是——
- 运行时异常
- 算术异常
- NumberFormatException
- 空指针异常
- ArrayIndexOutOfBoundsException
- ClassCastException
- java.lang.InterruptedException
- java.lang.IOException
- java.lang.SQLException
- java.lang.ParseException
- 运行时异常
11. Java 中的运行时异常是什么? 举几个例子。
在运行时发生的异常称为运行时异常。 编译器无法识别这些异常,例如未经检查的异常。 它包括 java.lang.RunTimeException 和 java.lang.Error 的所有子类。 示例包括 NumberFormatException、NullPointerException、ClassCastException、ArrayIndexOutOfBoundException、StackOverflowError 等。
12. 在 Java 中定义 OutOfMemoryError。
它是 JVM 内存不足时遇到的 java.lang.Error 的子类。
13.区分Java中的NoClassDefFoundError和ClassNotFoundException。
NoClassDefFoundError 和 ClassNotFoundException 都在运行时找不到特定类时发生。 但是,它们发生在不同的场景下。 NoClassDefFoundError 是因为在编译时存在特定类但在运行时丢失而发生错误。 当应用程序在运行时尝试加载未在类路径中更新的类时遇到异常时,会发生 ClassNotFoundException。
14. 如果'try'或'catch'块返回控制,'finally'块是否被执行?
'finally' 块总是被执行,不管 try 或 catch 块是否返回控制。
15. 可以手动抛出异常吗? 如果是,请说明如何。

可以手动抛出异常。 它是使用 'throw' 关键字完成的。 手动抛出异常的语法是
抛出 InstanceOfThrowableType;
下面是使用“throw”关键字手动抛出异常的示例。
尝试
{
NumberFormatException ex = new NumberFormatException(); //这里我们显式地为NumberFormatException创建一个对象
扔前; //使用 throw 关键字显式抛出 NumberFormatException 对象
}
捕获(NumberFormatException 前)
{
System.out.println(“在这个块中,可以捕获显式抛出的 NumberFormatException 对象。”);
}
阅读: 35 大春季面试问答:终极指南
16. 在 Java 中重新抛出异常是什么意思?
在“try”块中引发的异常在“catch”块中处理。 如果“catch”块无法处理该异常,它可能会使用“throw”关键字重新抛出相同的异常。 这种机制称为重新抛出异常。 实现如下:
尝试
{
字符串 s = null;
System.out.println(s.length()); //这条语句抛出一个NullPointerException
}
捕捉(NullPointerException 前)
{
System.out.println(“这里捕获到 NullPointerException”);
扔前; //重新抛出 NullPointerException
}
17. 为什么在 Java 中使用 'throws' 关键字?
如果一个方法有可能在无法处理的情况下抛出异常,它应该使用'throws'关键字指定该异常。 这将有助于该方法的调用函数处理该异常。 使用“throws”关键字的语法是,
return_type method_name(parameter_list) throws exception_list
{
//代码
}
这里,exception_list 是方法可能抛出的异常列表。 这些异常应该用逗号分隔。 代码示例:
公共类异常处理
{
公共静态无效主要(字符串 [] 参数)
{
尝试
{
方法WithThrows();
}
捕捉(NullPointerException 前)
{
System.out.println("methodWithThrows() 方法抛出的 NullPointerException 将在此处捕获");
}
}
static void methodWithThrows() 抛出 NullPointerException
{
字符串 s = null;
System.out.println(s.length()); //这条语句抛出NullPointerException
}
}
18. 通常建议在“finally”块内保持清理操作,例如关闭数据库资源。 为什么有必要?
无论是否在“try”块中引发异常或是否在“catch”块中捕获了引发的异常,都始终执行“finally”块。 将清理操作保留在“finally”块中可确保这些操作在任何情况下都可以执行,并且不会受到可能会或可能不会上升的异常的影响。
19. 你如何区分 Java 中的 final、finally 和 finalize?
首先,'final' 是一个关键字,可用于使变量、方法或类成为不可更改的。 简单来说,如果一个变量被声明为final,一旦它被初始化,它的值就不能被改变。 如果一个方法被声明为 final,它就不能在子类中被覆盖或修改。 如果一个类被声明为 final,它就不能被扩展为更多的类。
其次,“finally”是一个与“try”和“catch”块一起用于异常处理的块。 无论引发的异常或是否处理了引发的异常,都会始终执行此块。 通常,此块用于执行清理操作以关闭数据库连接、I/O 资源等资源。
第三,finalize() 方法是受保护的方法。 它属于 java.lang.Object 类。 在 Java 中创建的每个类都继承此方法。 垃圾收集器线程在从内存中删除对象之前调用此方法。 在从内存中删除对象之前,此方法用于执行一些清理操作。
protected void finalize() 抛出 Throwable
{
//清理操作
}
20、什么是java中的自定义异常?
Java中可以根据程序流程的要求抛出异常类。 这些异常称为用户定义的异常。 它们也称为自定义异常。 这些异常必须扩展异常层次结构中的任何一个类。
21. 你会如何解释 Java 中的 ClassCastException?
当 JVM 无法将一种类型的对象转换为另一种类型时,会引发此异常。 这是一个 RunTimeException。
22. 区分 Java 中的 throw、throws 和 throwable。
首先,关键字“throw”用于在 Java 中手动抛出异常。 使用这个关键字,可以从任何方法或块中抛出异常。 但是,异常必须是 java.lang.Throwable 类的类型,或者它属于 java.lang.Throwable 类的子类之一。
其次,在 Java 的方法签名中使用了关键字“throws”。 如果该方法能够抛出异常,则由该方法指示。 提到的异常由它们各自的调用函数处理。 它可以通过使用 try 和 catch 块或使用 throws 关键字来完成。
第三,Java中所有类型错误和异常的超类称为Throwable。 它是 java.lang 包的成员。 JVM 或 throw 语句仅引发此类或其子类的实例。 catch 块应该只包含一个参数,它应该是这种类型或其子类。 如果创建了自定义异常,它们也应该扩展这个类。
23. 解释 Java 中的 StackOverflowError。
这是JVM在运行时堆栈溢出时抛出的错误。
24. 是否可以用子类中的已检查异常重写抛出未检查异常的超类方法?
这是不可能的,因为如果超类方法抛出未经检查的异常,它将在子类中被相同的异常或任何其他未经检查的异常覆盖。 但是,它不能被检查异常覆盖。
25.在Java中定义链式异常。
在程序中,一个异常可以通过引发多米诺骨牌效应引发许多异常。 这会导致一系列异常。 知道异常的实际原因的位置是有益的。 这可以通过 Java 中的链式异常功能实现。 这是自 JDK 1.4 以来引入的。 为了在 Java 中实现链式异常,Throwable 类中包含了两个新的构造函数和两个新方法。 这些是,
Throwable 类的构造函数:
- Throwable(Throwable Cause):原因是引发当前异常的异常。
- Throwable(String msg, Throwable Cause):msg 字符串是异常消息。 引发当前异常的异常是这里的原因。
Throwable 类的方法:
- getCause() 方法:此方法返回引发异常的真正原因。
- initCause(Throwable Cause) 方法:调用异常的原因由该方法设置。
26. 哪个类被定义为Java中所有类型错误和异常的超类?
所有类型的错误和异常的超类是 Java 中的 java.lang.Throwable。
27. 什么可以归类为 try、catch 和 finally 块的正确组合?
try 和 catch 块的组合。
尝试
{
//尝试块
}
捕捉(异常前)
{
//捕获块
}
try 和 finally 块的组合。
尝试
{
//尝试块
}
最后
{
//最终阻塞
}
三者的组合:try、block、finally 块。
尝试
{
//尝试块
}
捕捉(异常前)
{
//捕获块
}
最后
{
//最终阻塞
}
28. 为什么要使用 printStackTrace() 方法?
此方法用于打印有关发生的异常的详细信息。
29. 检查异常的例子有哪些?
检查异常的一些示例包括 ClassNotFoundException、SQLException 和 IOException。

30. 有哪些未经检查的异常的例子?
未经检查的异常的一些示例包括 NullPointerException、ArrayIndexOutOfBoundsException 和 NumberFormatException。
另请阅读:必须阅读 47 OOPS 面试问题和答案,适合应届生和有经验的人
包起来
如果您有兴趣了解有关大数据的更多信息,请查看 upGrad 和 IIIT-B 的全栈软件开发 PG 文凭,该文凭专为在职专业人士设计,提供 500 多个小时的严格培训、9 个以上的项目和作业,IIIT -B 校友身份、实用的实践顶点项目和顶级公司的工作协助。
如果您有兴趣学习数据科学并选择该领域的职业,请查看 IIIT-B 和 upGrad 的数据科学执行 PG 计划,该计划专为在职专业人士创建,提供 10 多个案例研究和项目、实用的实践研讨会,与行业专家的指导,与行业导师的一对一,与顶级公司的 400 多个小时的学习和工作协助。
