栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

抛出异常:为什么在没有throws子句的情况下编译方法?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

抛出异常:为什么在没有throws子句的情况下编译方法?

仅在Java 1.7上会出现此现象。使用1.6进行编译时,出现以下编译器错误消息:

c:devsrcmisc>javac -source 1.6 Main.javawarning: [options] bootstrap class path not set in conjunction with -source 1.6Main.java:22: error: unreported exception Exception; must be caught or declaredto be thrown        throw e;        ^1 error1 warning

但是,使用Java 1.7可以编译。

c:devsrcmisc>javac -source 1.7 Main.javac:devsrcmisc>

…直到我实际把一个块扔了

Exception
进去
try

public static void throwsOrNotThrowsThatsTheQuestion() {try {    // Any processing    throw new IOException("Fake!");} catch (Exception e) {    throw e;}

编译中…

c:devsrcmisc>javac -source 1.7 Main.javaMain.java:22: error: unreported exception IOException; must be caught or declared to be thrown        throw e;        ^1 error

看起来Java 1.7足够聪明

Exception
,可以通过分析
try
块代码来检测可能抛出
throwe;
的类型,而1.6刚看到类型
Exception
并为此给出了错误。

对其进行更改以

RuntimeException
使其按预期方式进行编译,因为与往常一样,未经检查的
Exception
s不需要
throws
子句:

public static void throwsOrNotThrowsThatsTheQuestion() {try {    // Any processing    throw new RuntimeException("Fake!");} catch (Exception e) {    throw e;}

编译中…

c:devsrcmisc>javac -source 1.7 Main.javac:devsrcmisc>

说明

这是怎么回事:

Java
7引入了更多的包容性类型检查。报价…

考虑以下示例:

static class FirstException extends Exception { }static class SecondException extends Exception { }public void rethrowException(String exceptionName) throws Exception {  try {    if (exceptionName.equals("First")) {      throw new FirstException();    } else {      throw new SecondException();    }  } catch (Exception e) {    throw e;  }}

本示例的try块可能抛出FirstException或SecondException。假设您要在rethrowException方法声明的throws子句中指定这些异常类型。在Java
SE
7之前的版本中,您不能这样做。因为catch子句e的异常参数是Exception类型,并且catch块重新抛出了异常参数e,所以只能在rethrowException方法声明的throws子句中指定异常类型Exception。

但是, 在Java SE
7中,可以在rethrowException方法声明的throws子句中指定异常类型FirstException和SecondException

。Java SE 7编译器可以确定语句throw
e引发的异常必须来自try块,而try块引发的唯一异常可以是FirstException和SecondException。即使catch子句e的异常参数是Exception类型,编译器仍可以确定它是FirstException或SecondException的实例:

(强调我的)

public void rethrowException(String exceptionName)throws FirstException, SecondException {  try {    // ...  }  catch (Exception e) {    throw e;  }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/449532.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号