Java异常处理 “受控(checked)”的异常
2015-11-14 20:52
381 查看
示例程序:
为什么以上程序完全符合Java语法规范,但是却会报错呢?
修正:
throws语句表明某方法中可能出现某种(或多种)异常,但它自己不能处理这些异常,而需要由调用者来处理。
当一个方法包含throws子句时,需要在调用此方法的代码中使用try/catch/finally进行捕获,或者是重新对其进行声明,否则编译时报错。
受控与不受控的异常
throws语句中声明的异常称为受控(checked)的异常,通常直接派生自Exception类。
RuntimeException(其基类为Exception)和Error(基类为Throwable)称为非受控的异常。这种异常不用在throws语句中声明。
CheckedExceptionDemo.java示例展示了上述两种异常的特性。
抛出多个受控异常的方法
一个方法可以声明抛出多个异常
int g(float h) throws OneException,TwoException { …… }
例如:
结果截图:
注意一个Java异常处理中的一个比较独特的地方:
当一个方法声明平抛出多个异常时,再次方法调用语句处只要catch其中任意一个异常,代码就可以顺利编译。
子类抛出受控异常的限制:
一个子类的throws子句抛出的异常,不能是其基类同名方法抛出的异常对象的父类。
Java 7 及以后的版本,允许在一个catch块中捕获多个异常。
例如:
public class TestThrows { public static void main(String[] args) { FileInputStream fis = new FileInputStream("a.txt"); } }
为什么以上程序完全符合Java语法规范,但是却会报错呢?
修正:
public class TestThrows { public static void main(String[] args) throws FileNotFoundException { FileInputStream fis = new FileInputStream("a.txt"); } }
throws语句表明某方法中可能出现某种(或多种)异常,但它自己不能处理这些异常,而需要由调用者来处理。
当一个方法包含throws子句时,需要在调用此方法的代码中使用try/catch/finally进行捕获,或者是重新对其进行声明,否则编译时报错。
受控与不受控的异常
throws语句中声明的异常称为受控(checked)的异常,通常直接派生自Exception类。
RuntimeException(其基类为Exception)和Error(基类为Throwable)称为非受控的异常。这种异常不用在throws语句中声明。
CheckedExceptionDemo.java示例展示了上述两种异常的特性。
抛出多个受控异常的方法
一个方法可以声明抛出多个异常
int g(float h) throws OneException,TwoException { …… }
例如:
import java.io.*; public class ThrowMultiExceptionsDemo { public static void main(String[] args) { try { throwsTest(); } catch(IOException e) { System.out.println("捕捉异常"); } } private static void throwsTest() throws ArithmeticException,IOException { System.out.println("这只是一个测试"); // 程序处理过程假设发生异常 throw new IOException(); //throw new ArithmeticException(); } }
结果截图:
注意一个Java异常处理中的一个比较独特的地方:
当一个方法声明平抛出多个异常时,再次方法调用语句处只要catch其中任意一个异常,代码就可以顺利编译。
子类抛出受控异常的限制:
一个子类的throws子句抛出的异常,不能是其基类同名方法抛出的异常对象的父类。
import java.io.*; public class OverrideThrows { public void test()throws IOException { FileInputStream fis = new FileInputStream("a.txt"); } } class Sub extends OverrideThrows { //如果test方法声明抛出了比父类方法更大的异常,比如Exception //则代码将无法编译…… public void test() throws FileNotFoundException { //... } }
Java 7 及以后的版本,允许在一个catch块中捕获多个异常。
例如:
try { //... throw new SocketException(); } catch (SocketException | SecurityException | NullPointerException e) { //exception handler }
相关文章推荐
- java内存模型-先行发生原则
- Java 设计模式 (1) 策略模式
- Java多态性理解
- Java基础之List集合原理(二)
- 从头认识java-8.11 为什么需要内部类?
- java 子类重写父类的方法应注意的问题
- Java异常捕获 跟踪异常的传播路径
- Java异常处理 finally用法
- java内存模型-续1
- Java继承 学习 && 类初始化顺序
- java内存模型-对long和double型变量的特殊规则
- java io流 复制文本和媒体文件(TextCopy,MusicCopy)
- eclipse工具栏不显示sdk和adb图标?
- 【Java基础】List迭代并修改时出现的ConcurrentModificationException问题
- java连接数据库的步骤
- ubuntu上搭建eclipse下hadoop-2.7.1集群(全分布式)开发环境遇到的几个问题笔记
- Java多层的异常捕获
- Java 学习笔记
- java-内存模型-概述
- Java异常处理