【问题标题】:This is about the Exception Handling and the Exception Matching Concept in Java这是关于Java中的异常处理和异常匹配概念
【发布时间】:2015-11-18 09:11:57
【问题描述】:

我是 Java 新手。我正在研究异常处理概念,但我在这里停留了一点。 我们知道,每当抛出异常时,Java 都会尝试以自上而下的方式查看可用的 catch 子句来查找。如果找不到,它将搜索异常超类型的处理程序。如果没有找到与异常超类型匹配的 catch 子句,则将异常沿调用堆栈传播。

此外,如果将大多数特定异常置于更通用的异常处理程序之上,则会导致编译错误。

假设我们有如下代码:-

try{
    // do not know what kind of exception it will be throwing but I am sure that it is IOException
   }

try{
     // Here the FileNotFoundException is thrown
   }

catch(IOException e){
//Do exception handling stuff
}

catch(FileNotFoundException f){
  //Do exception handling stuff`
 }

现在这段代码将导致编译错误,因为异常的超类型存在于实际异常之上。

那么为什么第一段不支持这个概念。即在检查JVM之后会发现合适的异常(FileNotFoundException)并且不应该关心IOException子句,而是会遇到编译错误。

请给它一些启示。 如果我能够解释我想要做什么,也请告诉我?

【问题讨论】:

  • 这段代码无法编译,因为try 跟随另一个try 块是非法语法。但是为什么你写的“第一段”要支持除了你脑子里的东西之外的任何东西?不清楚你在问什么。
  • 你有没有试过在IDE中写上面提供的代码sn-p。
  • 伙计们,请仔细阅读 - OP 知道代码无法编译!!! 一个与 SO 标准相关的好问题。我们的社区应该对初学者更加宽容。 OP 试图实现他理解的异常处理,但它不起作用,他在问我们他做错了什么。为什么有人要对这样的问题投反对票,就因为它低于他们的大师级别?

标签: java exception-handling


【解决方案1】:

您似乎误解了 try 的概念。您只有一次尝试,然后是 catch 子句。

try{
    // do not know what kind of exception it will be throwing but I am sure that it is IOException
   // Here the FileNotFoundException is thrown
}

catch(IOException e){
    //Do exception handling stuff
}

catch(FileNotFoundException f){
  //Do exception handling stuff`
 }

【讨论】:

  • 他有两个 try子句,非法放置。
  • @EJP:我认为 Mike Murphy 正在解决两个 trys 的问题!他正在(至少部分地)回答了OP的问题。
  • 我不是在谈论编程。我只是举个例子,假设我们在程序中的任何地方都有两个 try 子句,并且有 catch 来处理这些异常。
  • 一般JVM会寻找实际的catch子句,但是没有找到,就会去寻找那个异常类的超类。但关键是我们这里有它,为什么它会抛出编译错误。
【解决方案2】:

此代码将在编译时抛出错误,因为对于 FileNotFound Catch Block,代码将无法访问,因为它已由 IO Exception 处理,并且 FileNotFound 是 IOException 的子类

无法到达 FileNotFoundException 的 catch 块。它已经被 IOException 的 catch 块处理了

FileNotFoundException 是 IOException 的子类,让我们可以选择将所有 IOExceptions 视为相同,或者单独捕获一些 IOExceptions 子类

【讨论】:

    【解决方案3】:

    代码sn-p有根本错误

    如果在 try 块中发生异常,则该异常由与其关联的异常处理程序处理。要将异常处理程序与 try 块相关联,您必须在其后放置一个 catch 块

    推荐阅读:

    https://docs.oracle.com/javase/tutorial/essential/exceptions/try.html https://docs.oracle.com/javase/tutorial/essential/exceptions/catch.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      相关资源
      最近更新 更多