如果V的运行时类型与(第5.2节)a分配兼容 try语句的任何catch子句的可捕获异常类, 然后选择第一个(最左边)这样的catch子句。
什么是最左边的?我们从上到下放置了catch子句,例如:
try{ }
catch(IndexOutOfBoundException e){ }
catch(SQLException e){ }
catch(NullPointerException e){ }
//etc
答案 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 one
,quote
可以使用上述语法进行验证。
编辑 - 我修改。
它与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){ }
现在更清楚了。