java炒冷饭系列06 异常说明(throws)
来源:互联网 发布:决战武林法骑进阶数据 编辑:程序博客网 时间:2024/06/03 02:09
前言
java鼓励人们把方法可能会抛出的异常告知使用此方法的客户端程序员。这是种优雅的做法,它使得调用者能确切知道写什么样的代码可以捕获所有潜在的异常。
当然,如果提供了源代码,客户端程序员可以在源代码中查找throw语句来获知相关信息,然而程序库通常并不与源代码一起发布。为了预防这样的问题,java提供了相应的语法(并强制使用这个语法),使你能以礼貌的方式告知客户端程序员某个方法可能会抛出的异常类型,然后客户端程序员就可以进行相应的处理。
这就是异常说明,它属于方法声明的一部分,紧跟在形式参数列表之后。
异常说明使用了附加的关键字throws,后面接一个所有潜在异常类型的列表,所以方法定义可能看起来像这样:
void f() throws TooBig, TooSmall, DivZero{//...
但是,要是这样写:
void f(){//...
就表示此方法不会抛出任何异常(除了从RuntimeException继承的异常,它们可以在没有异常说明的情况下被抛出)
代码必须与异常说明保持一致。如果方法里的代码产生了异常却没有进行处理,编译器会发现这个问题并提醒你:要么处理这个异常,要么就在异常说明中表明此方法将产生异常。通过这种自顶向下强制执行的异常说明机制,java在编译时就可以保证一定水平的异常正确性。
不过还是有个能“作弊”的地方:可以声明方法将抛出异常,实际上却不抛出。编译器相信了这个声明,并强制此方法的用户像真的抛出异常那样使用这个方法。这样做的好处是,为异常先占个位子,以后就可以抛出这种异常而不用修改已有的代码。在定义抽象基类和接口时这种能力很重要,这样派生类或接口实现就能够抛出这些预先声明的异常。
这种在编译时被强制检查的异常称为被检查的异常
练习
定义一个类,令其方法抛出一个已检查异常。不用异常说明,看看能否通过编译。然后加上异常说明,用try-catch子句测试该类和异常
public class ExceptTest { public void method(){ throw new Exception(); }}
上述代码抛出了一个已检查异常,介没有异常说明,所以编译会通不过,所以要改写成
public class ExceptTest { public void method() throws Exception { throw new Exception(); }}
在调用上述定义的method()方法时要么继续抛出异常,要么用try-catch补获
class MethodInvoke{ public static void main(String[] args) { ExceptTest et = new ExceptTest(); try { et.method(); } catch (Exception e) { e.printStackTrace(); } }}
class MethodInvoke{ public static void main(String[] args) throws Exception { ExceptTest et = new ExceptTest(); et.method(); }}
总结
理解异常说明的意义(理解其设计的意义是非学重要的)
理解异常说明的的用法
参考文献
《java编程思想》12.5异常说明
- java炒冷饭系列06 异常说明(throws)
- java炒冷饭系列06 异常匹配
- java炒冷饭系列07 java标准异常
- java炒冷饭系列01 方法的重载
- java炒冷饭系列02 方法的重写
- java炒冷饭系列03 接口修饰符
- java炒冷饭系列08 try-with-resources
- java炒冷饭系列14 内部类标识符
- 73、java异常-throws
- JAVA 异常 throw 与 throws
- Java开发 - 异常 - 使用throws
- java异常处理 throw throws
- java 异常中的throws关键字
- java异常分类和throws
- Java异常处理-throws关键字
- java炒冷饭系列04 初始化及类的加载
- java炒冷饭系列12 嵌套类(静态内部类)
- java炒冷饭系列13 内部类的继承
- java中 & 和 &&的区别
- 2017全球超级计算Top500和Green500榜单出炉
- Windows下mnist数据集caffemodel分类模型训练及测试
- HTML5-列表标签
- POJ 1496 Word Index 笔记
- java炒冷饭系列06 异常说明(throws)
- HTML+CSS编写静态网站-11 添加画册图像
- 27、不一样的C++系列--继承的构造与析构
- asp.net core 更改发布后默认的 端口号
- QSS美化之QGroupBox
- Python lambda表达式
- 解决android studio出现building gradle project info不动的问题
- linux内核初始化
- Server Tomcat v7.0 Server at localhost failed to start的解决办法