Java异常处理问答

时间:2020-01-09 10:35:22  来源:igfitidea点击:

在这篇文章中,有一系列Java异常处理的问题和答案。

Java异常处理面试问题

  • 什么是异常?可以将异常定义为破坏代码正常流程的条件。由于异常是在运行时发生的,因此当前的代码处理无法继续进行,因此需要处理由异常处理程序机制接管的异常。在此处阅读有关Exception的更多信息。
  • 什么是错误?错误及其子类定义程序无法处理的异常,例如内存不足错误。例如– StackOverflowError,OutOfMemoryError。
  • Java中的异常处理如何工作?在任何方法中发生异常情况时,Java中用于异常处理的过程如下:异常对象封装了有关错误,异常类型以及发生异常的信息。
  • 停止执行该方法中的代码,并引发创建的异常。
  • 异常处理机制寻找可以处理引发的异常的异常处理程序。引发异常的方法可以自行处理该异常,也可以将其留给调用方法来处理。
  • 如果没有为抛出的异常提供异常处理程序,则将调用默认异常处理程序来处理该异常。默认异常处理程序从引发异常时开始打印堆栈跟踪,并终止程序。

在此处阅读有关Exception的更多信息。

  • 如何在Java中管理异常处理? Java中的异常处理使用5个关键字进行管理-try,catch,finally,throw和throws。
  • Java中所有异常类的父类是哪个? Throwable类是Java中所有异常类的父类。
  • 解释Java中的异常层次结构? Throwable类是Java中所有异常类的父类。在Java异常层次结构中Throwable的正下方是两个子类,它们将异常分为两个不同的分支。这些子类是Exception和Error。请参阅异常层次结构。
  • Java中异常处理的优点是什么? Java中的异常处理提供了一种从运行时错误中正常恢复的机制。通过将具有逻辑的代码与处理异常的代码分开,可以提供更好的设计。
  • 如何使用try-catch块处理代码中的异常。将代码(可能会引发异常)封装在try块中。 catch块用于处理try块中引发的异常。
try {
// Code that may throw excpetion
}
catch (ExceptionType exp){
// Exception handler for ExceptionType
}

在此处阅读有关try-catch块的更多信息。

  • 到底是什么?当代码中引发异常时,该方法的正常执行流程将中断,这可能导致打开的资源永不关闭。在这种情况下,我们确实需要一种清理机制,Java的最终阻止对清理机制有帮助。 Java中的try-catch-finally块具有以下形式
try {
// Code that may throw excpetion
}
catch (ExceptionType exp){
// Exception handler for ExceptionType
}
finally{
// code that has to be executed after try block completes
}

在此处阅读更多有关finally块的信息。

  • 我们可以有一个没有catch块的try块吗?是的,我们可以有一个没有catch块的try块,但是在这种情况下,try块后面应该是finally块。尝试块之后必须是catch或者finally或者两者。在此处阅读有关try-catch块的更多信息。
  • 如果try块中没有错误,将执行finally块吗?无论是否在try块中引发异常,Java中的final块始终执行。在此处阅读更多有关finally块的信息。
  • 如果将异常抛出到finally块中会怎样?如果try块中包含的代码引发异常,而finally块也引发异常,则finally子句引发的异常将掩盖try块中引发的异常。
  • 如果try块中有return语句且未引发任何异常,在这种情况下将最终执行块怎么办?即使try块中有return语句,并且try块中没有抛出异常,finally块仍将在方法返回之前执行。
  • Java最终何时不执行块?如果在执行try或者catch代码的同时退出JVM(System.exit()或者JVM崩溃),则finally块可能不会执行。同样,如果执行try或者catch代码的线程被中断或者杀死,则finally块可能不会执行。在此处阅读更多有关finally块的信息。
  • 什么是嵌套的try语句?在嵌套try中,一个try-catch块驻留在外部try-catch块中。如果内部try中发生异常,并且找不到catch块来处理该类型的异常,则检查next(外部)try语句是否存在异常处理程序,依此类推。在此处阅读有关嵌套try语句的更多信息。
  • 在try块之后可以有多个catch块吗?是的,在try块之后可以有多个catch块。如果引发了异常,则异常处理机制将使用带有与引发的异常类型相匹配的参数的catch块来查找。仅执行多个catch块中匹配的catch子句。在此处阅读有关多个捕获块的更多信息。
  • 什么时候会出现关于多个catch块的无法到达的代码编译错误?对于多个catch块,我们将必须确保任何异常超类都不会出现在其异常子类之前。将具有子类作为参数的catch语句放在以超类作为参数的catch语句之后,将意味着具有子类的catch语句不可访问,从而导致不可访问的代码错误。
catch(Exception exp){
  exp.printStackTrace();
}catch(ArithmeticException exp){
  exp.printStackTrace();
}

由于Exception类是ArithmeticException异常的超类,因此将catch语句放在第一位将导致无法到达的代码编译时错误。

  • Java中的throw关键字是什么?或者如何从代码中手动引发异常?我们可以在Java代码中显式引发异常,这可以使用Java中的throw关键字来完成。
throw throwableObj;

在这里throwableObj必须是Throwable类或者其任何子类的实例。在此处阅读有关Java中throw关键字的更多信息。

  • 我们可以重新抛出抛出的异常吗?是的,我们可以重新抛出在catch块中捕获的异常。如果捕获异常的catch块未对其进行处理,则可以使用throw关键字将该异常重新抛出,以由可以处理该异常的异常处理程序捕获。例如
catch(Exception exp){
  System.out.println("Exception occurred while dividing" + exp.getMessage());
  throw exp;
}

在这里,超类Exception正在捕获异常,因此我们可以将其重新抛出以由特定的异常处理程序捕获。我们也可以选择从引发的异常中重新引发不同的异常。例如

catch(SQLException ex){
  throw new RuntimeException("Error in DB layer", ex);
}
  • Java中的throw子句是什么?我们可以指定方法中未处理的异常以及方法声明。这样,我们就将其留给调用方法来为那些异常提供异常处理机制。
type methodName(parameters) throws exception1, excpetion2...{
   ...
   ...
}

如果方法中没有处理异常,则必须在方法声明中使用throws子句指定所有已检查的异常。在此处阅读有关Java中throws子句的更多信息。

  • Java中哪些已检查和未检查的异常? Java异常处理中有三种异常类型:Checked Exceptions-这些是代码应能够预期并从中恢复的异常。 Java编译器甚至会迫使我们将预期引发检查异常的代码放入try-catch块中,或者使用throws指定它。错误-这些是应用程序外部的特殊情况,应用程序通常无法预期或者从中恢复。运行时异常–这些是应用程序内部的例外情况,这些应用程序通常无法预期或者从中恢复。错误和运行时异常统称为未检查的异常。在此处阅读有关已检查和未检查异常的更多信息。
  • 什么是Java中的异常传播?当方法中引发异常时,可以在该方法中对其进行处理,也可以将其传递给调用方堆栈中的其他方法进行处理。这种遍历方法调用堆栈以查找可以处理引发的异常的异常处理程序的过程在Java中称为异常传播。在此处阅读有关异常传播的更多信息。
  • 以下代码有什么问题吗?
// Parent class
class Read {
  public void readFile() throws IOException{
    System.out.println("read file");
  }
}
// child class
public class FileRead extends Read {
  // Overridden method
  public void readFile() throws Exception{
    File file = new File("D://test.txt");
    BufferedReader br = new BufferedReader(new FileReader(file));
  }
...
...
}

是的,该代码将在编译" Exception是IOException的超类型"时给出错误。由于该规则,Subclass重写的方法可以声明父类方法中声明的异常的任何子异常。但是它不能在层次结构中声明更高的任何异常。在此处阅读更多有关异常处理规则的信息,并参考方法重写。

  • Java中的链式异常是什么?在Java中使用链接式异常,可以将一个异常与另一个异常关联。链式异常有助于一个异常导致另一异常的情况。在此处阅读有关链式异常的更多信息。
  • Java中的多捕获异常是什么?使用Java 7中添加的Multi-catch语句,单个catch块可以处理多种类型的异常。这样,我们可以避免代码重复,也可以避免将Exception类用作包罗万象的子句的趋势,这将隐藏真正的原因。在多捕获语句中,我们需要使用竖线(|)分隔catch子句中的每种异常类型。一般形式
catch(Exception Type 1 | Exception Type 2 ex){
  ...
  ...
}
  • 什么是Java中的try-with-resources?Java 7的try-with-resources有助于自动资源管理。通过使用Java中的try-with-resources功能,可以使用try语句本身声明一个或者多个资源。 try-with-resources语句可确保声明的资源最后自动关闭。使用try-with-resources,我们不需要单独的finally块即可关闭资源。在此处阅读更多关于try-with-resources的信息。
  • 什么是自动关闭界面?由于Java 7中引入了接口java.lang.AutoCloseable,因此使用Java中的try-with-resources自动关闭资源。任何实现java.lang.AutoCloseable接口的对象都可以用作try-with-resource的资源。
  • try-with-resource的抑制异常是什么?如果从try块引发异常,并且从try-with-resource语句引发异常,那么抑制try-with-resource语句引发的异常,并返回try块引发的异常。
  • 如何在Java中创建自定义异常类?在此处查看如何在Java中创建自定义异常类。