Java-第十二章 异常处理和文本 I/O-学习总结

第十二章 异常处理和文本 I/O

12.1 异常处理概述

异常是从方法抛出的 。 方法的调用者可以捕获以及处理该异常 。
不应该让方法来终止程序,应该有调用者决定是否终止程序。
throw 语句的执行称为批出一个异常 ( throwing an exception ) 。 异常就是一个从异常类创建的对象 。
throw 语句类似于方法的调用,但不同于调用方法的是 , 它调用的是 catch 块 。 从某种意义上讲 , catch 块就像带参数的方法定义,这些参数匹配抛出的值的类型 。 但是 ,它不像方法,在执行完 catch 块之后,程序控制不返回到 throw 语句 ; 而是执行 catch 块后的下一条语句 。
异常处理最根本的优势就是将检测错误 ( 由被调用的方法完成 )从处理错误( 由调用方法完成 ) 中分离出来 。

12.2 异常类型

异常是对象 , 而对象都采用类来定义 。 异常的根类是 java . lang . Throwable 。
Java-第十二章 异常处理和文本 I/O-学习总结_第1张图片
异常类可以分为三种主要类型 : 系统错误 、异常和运行时异常 。
系统错误 ( system error ) 是由 Java 虚拟机抛出的,用 Error 类表示 。 Error 类描述的是内部系统错误 。 这样的错误很少发生 。如果发生 ,除了通知用户以及尽量稳妥地终止程序外,几乎什么也不能做 。在这里插入图片描述
异常 ( exception ) 是 用 Exception 类表示的,它描述的是由程序和外部环境所引起的错误 ,这些错误能被程序捕获和处理 。
Java-第十二章 异常处理和文本 I/O-学习总结_第2张图片
运行时异常 ( runtime exception ) 是用 RuntimeException 类表示的,它描述的是程序设计错误 ,例如,错误的类型转换 、访问一个越界数组或数值错误 。 运行时异常通常是由 Java 虚拟机抛出的 。
Java-第十二章 异常处理和文本 I/O-学习总结_第3张图片
RuntimeException 、 Error 以及它们的子类都称为免检异常( unchecked exception ) 。 所有其他异常都称为必检异常( checked exception ), 意思是指编译器会强制程序员检査并通过 try catch 块处理它们 , 或者在方法头进行声明 。

12.3 关于异常处理的更多知识

异常的处理器是通过从当前的方法开始 , 沿着方法调用链 , 按照异常的反向传播方向找到的 。

12.3.1 声明异常

在 Java 中,当前执行的语句必属于某个方法 。 Java 解释器调用 main 方法开始执行一个程序 。 每个方法都必须声明它可能抛出的必检异常的类型 。 这称为声明异常 ( declaringexception ) 。 因为任何代码都可能发生系统错误和运行时错误 ,因此, Java 不要求在方法中显式声明 Error 和 RuntimeException ( 免检异常 ) 。 但是,方法要拋出的其他异常都必须在方法头中显式声明,这样 ,方法的调用者会被告知有异常 。
public void myMethod()
throws Exception1, Exception2, …, ExceptionN
注意 : 如果方法没有在父类中声明异常 , 那么就不能在子类中对其进行继承来声明异常 。

12.3.2 抛出异常

检测到错误的程序可以创建一个合适的异常类型的实例并抛出它 ,这就称为抛出一个异常 ( throwing an exception ) 。
提示 : 声明异常的关楗字是 throws , 抛出异常的关键字是 throw 。

12.3.3 捕获异常

Java-第十二章 异常处理和文本 I/O-学习总结_第4张图片
如果异常类型是 Exceprion 3 , 它就会被 method2 中处理异常 ex 3 的 catch 块捕获 。跳过 statement5 , 然后执行 statement6 。
如果异常类型是 Exception 2 , 则退出 method2 , 控制被返回给 method1 , 而这个异常就会被 method1 中处理异常 ex 2 的 catch 块捕获 。 跳过 statement3 , 然后执行statement 4。
如果异常类型是 Exception 1, 则退出 methodl, 控制被返回给 main 方法 ,而这个异常就会被 main 方法中处理异常 ex 1的 catch 块捕获 。 跳过 statementl 1, 然后执行statement2 。
如果异常类型没有在 method 2 、 methodl1和 main 方法中被捕获 , 程序就会终止 。 不执行 statement1和 statement 2。
注意 : 从一个通用的父类可以派生出各种异常类 。 如果一个 catch 块可以捕获一个父类的
异常对象 , 它就能捕获那个父类的所有子类的异常对象 。
注意 : 在 catch 块中异常被指定的顺序是非常重要的 。 如果父类的 catch 块出现在子类的
catch 块之前,就会导致编译错误 。例如 , a 中的顺序是错误的 , 因为 RuntimeException
是 Exception 的一个子类 。 正碎的顺序应该如 b 中所示 。Java-第十二章 异常处理和文本 I/O-学习总结_第5张图片
注意 : Java 强迫程序员处理必检异常 。 如果方法声明了一个必检异常( 即 Error 或Runtime Exception 之外的异常 ),就必须在 try catch 块中调用它 ,或者在调用方法中声明要抛出异常 。例如 , 假定方法 p1调用方法 P 2 , 而 p 2 可能会抛出一个必检异常 ( 例如 ,IOException ) , 就必须如 a ) 和 b ) 所示编写代码 。
Java-第十二章 异常处理和文本 I/O-学习总结_第6张图片
注意 : 对于使用同样的处理代码处理多个异常的情况在这里插入图片描述

12.3.4 从异常中获取信息

Java-第十二章 异常处理和文本 I/O-学习总结_第7张图片

12.4 finally 子句

try {
statements;
}
catch (TheException ex) {
handling ex;
}
finally {
finalStatements;
}

在任何情况下, finally 块中的代码都会执行 , 不论 try 块中是否出现异常或者是否被捕获 。 考虑下面三种可能出现的情况 :
1.如果 try 块中没有出现异常 , 执行 final Statements , 然后执行 try 语句的下一条语句 。
2.如果 try 块中有一条语句引起异常,并被 catch 块捕获 , 然后跳过 try 块的其他语句,执行 catch 块和 finally 子句 。 执行 try 语句之后的下一条语句 。
3.如果 try 块中有一条语句引起异常 , 但是没有被任何 catch 块捕获 ,就会跳过 try 块中的其他语句,执行 finally 子句,并且将异常传递给这个方法的调用者 。
即使在到达 finally 块之前有一个 return 语句 , finally 块还是会执行。

12.5 何时使用异常

异常出现在方法中 。 如果想让该方法的调用者处理异常 ,应该创建一个异常对象并将其抛出 。 如果能在发生异常的方法中处理异常 , 那么就不需要抛出或使用异常 。
一般来说,一个项目中多个类都会发生的共同异常应该考虑作为一种异常类 。 对于发生在个别方法中的简单错误最好进行局部处理 , 无须抛出异常 。

12.6 重新抛出异常

如果异常处理器不能处理一个异常 ,或者只是简单地希望它的调用者注意到该异常 , Java 允许该异常处理器重新抛出异常 。
重新拋出异常的语法如下所示 :
try {
statements ;
}
catch(TheException ex ){
perform operations before exits ;
throw ex;
}
语句 throw ex 重新抛出异常给调用者,以便调用者的其他处理器获得处理异常 ex 的机会 。

12.7 链式异常

和其他异常一起抛出一个异常 ,构成了链式异常 。

12.8 创建自定义异常类

Java 提供相当多的异常类 , 尽量使用它们而不要创建自己的异常类 。 然而 , 如果进到一个不能用预定义异常类恰当描述的问题 , 那就可以通过派生 Exception 类或其子类 。

12.9 File 类

File 类包含了获得一个文件 / 目录的属性 , 以及对文件 / 目录进行改名和删除的方法 。
绝对文件名 ( absolute file name ) 是由文件名和它的完整路径以及驱动器字母组成 。
F i l e 类意图提供了一种抽象 , 这种抽象是指以不依赖机器的方式来处理很多依赖于机器的文件和路径名的复杂性 。 F i l e 类包含许多获取文件属性的方法 ,以及重命名和删除文件和目录的方法。 但是 , File 类不包含读写文件内容的方法 。Java-第十二章 异常处理和文本 I/O-学习总结_第8张图片
注意 : 构建一个 File 实例并不会在机器上创建一个文件 。 不管文件是否存在,都可以创建任意文件名的 File 实例 。 可以调用 File 实例上的 exists()方法来判断这个文件是否存在 。

12.10 文件输入和输出

要点提示 : 使用 Scanner 类从文件中读取文本數据 , 使用 PrintWriter 类向文本文件写入数据 。

12.10.1 使用 Printwriter 写数据

Java-第十二章 异常处理和文本 I/O-学习总结_第9张图片

12.10.2 使用 try-with-resources 自动关闭资源

JDK 7 提供了下面的新的try-with-resources 语法来自动关闭文件。
try( 声明和创建资源 ) {
使用资源来处理文件;

12.10.3 使用 Scanner 读数据

Java-第十二章 异常处理和文本 I/O-学习总结_第10张图片

12.10.4 Scanner如何工作

12.11 从 Web 上读取数据

Java-第十二章 异常处理和文本 I/O-学习总结_第11张图片
为了读取一个文件,首先要使用 java,net,URL 类的这个构造方法,为该文件创建一个URL对象。
public URL(String spec) throws MalformedURLException

你可能感兴趣的:(Java基础)