“最左边”在该定义中意味着什么?

时间:2014-10-03 11:29:18

标签: java exception

JLS at the 14.20.1说:

  

如果V的运行时类型与(第5.2节)a分配兼容   try语句的任何catch子句的可捕获异常类,   然后选择第一个(最左边)这样的catch子句。

什么是最左边的?我们从上到下放置了catch子句,例如:

try{ }
catch(IndexOutOfBoundException e){ }
catch(SQLException e){ }
catch(NullPointerException e){ }
//etc

4 个答案:

答案 0 :(得分:6)

这与Java的任何新语言功能无关。

术语“最左边”仅涉及最早发生的捕获条款。将代码描绘为一维标记序列,从左到右延伸。这就是语言分析器看到它的方式。

因此,所有规定都是输入第一个匹配的catch子句。

答案 1 :(得分:4)

从技术上讲,你的例子可以写成:

try{ } catch(IndexOutOfBoundException e){ } catch(SQLException e){ } catch(NullPointerException e){}

最左边只是按程序顺序排在第一位。

ps:它与多捕获异常无关,虽然目前还没有多捕获概念,但也可以在3rd edition of the JLS中找到措辞。

答案 2 :(得分:1)

您引用的JLS对于高于6的版本完全有效。

您的问题中引用的代码中没有leftmost

对于Java 8 - 异常处理有不同的语法。

例如 - 您可以做一些像

这样的事情
 catch (Exception one | Exception two | Exception three) {
  // handling part
 }

此处,最左侧是Exception onequote可以使用上述语法进行验证。

编辑 - 我修改。

它与Java 7或更高版本中引入的catch语法无关。

leftmost表示首先遇到的catch块,它与异常类型thrown匹配。

例如

try {
   throw E1;
} catch (Exception E1) {}   //1
  catch (Exception E2) {}   //2
  catch (Exception E3) {}   //3

对于上面的代码,leftmost catch块位于1

请随时发表评论并分享您的知识。

答案 3 :(得分:0)

我们可以转换以下

try{ }
catch(IndexOutOfBoundException e){ }
catch(SQLException e){ }
catch(NullPointerException e){ }  

try{ } catch(IndexOutOfBoundException e){ } catch(SQLException e){ }catch(NullPointerException e){ } 

现在你可以看到最左边的东西了。换句话说,我们可以说最早出现的catch条款。

Java 7以来我们可以清楚地说出这一点。因为我们可以将多个catch写为

  try{ }
  catch(IndexOutOfBoundException |SQLException |NullPointerException e){ }

现在更清楚了。

相关问题