Java 异常
Error和Exception
- 异常(Exception)指程序运行中出现的预期之外的情况,如:文件找不到,网络连接失败等。
- 异常发生在程序运行期间,它影响了正常的程序执行流程。
- 分类:
- 检查性异常:代表性的异常是用户错误或者问题引起的异常,如打开一个不存在的文件引起的异常。这些异常在编译时不能被简单的忽略。
- 运行时异常:指可能被程序员避免的异常,运行时异常可以在编译时被忽略。
- 错误 Error:不是异常,而是脱离程序员控制的问题。错误在代码中常会被忽略,比如,当栈溢出时,一个错误就发生了,它们在编译时也是检查不到的。
- 异常体系结构:
- Java 把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
- 在 Java API中已经定义了许多异常类,这些异常类分为两大类,错误 Error 和异常 Exception。
- error 类对象由 Java 虚拟机生成并抛出,大多数错误和代码编写者无关
捕获和抛出异常
-
捕获异常
-
使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。
try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:
try { // 程序代码 }catch(ExceptionName e1) { //Catch 块 }// 文件名 : ExcepTest.java import java.io.*; public class ExcepTest{ public static void main(String args[]){ try{ int a[] = new int[2]; System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } System.out.println("Out of the block"); } } //输出: Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 Out of the blockCatch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。
-
多重捕获:
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }catch(异常类型3 异常的变量名3){ // 程序代码 }上面的代码段包含了 3 个 catch块。
可以在 try 语句后面添加任意数量的 catch 块。
如果保护代码中发生异常,异常被抛给第一个 catch 块。
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者通过所有的 catch 块。
try { file = new FileInputStream(fileName); x = (byte) file.read(); } catch(FileNotFoundException f) { // Not valid! f.printStackTrace(); return -1; } catch(IOException i) { i.printStackTrace(); return -1; }
-
-
抛出异常
-
使用 throw 和 throws 来抛出异常,其中 throw 用来在代码抛出异常,throws 用于在方法声明中指定可能会抛出的异常类型。
-
throw 用于在当前方法中抛出一个异常。正常情况下,当代码执行到某一个条件时无法继续正常执行时,可以通过 throw 抛出异常让程序员了解当前代码执行状态
//判断num是否小于0,如果是,则抛出一个IllegalArgumentException异常。 public void checkNumber(int num) { if (num < 0) { throw new IllegalArgumentException("Number must be positive"); } } -
throws 用于在方法中声明该方法可能抛出的异常。当方法内部抛出指定类型的异常时,该异常会被传递给调用该方法的代码,并在该代码中处理异常。
//方法声明抛出 RemoteException 和 InsufficientFundsException import java.io.*; public class className { public void withdraw(double amount) throws RemoteException, InsufficientFundsException { // Method implementation } //Remainder of class definition }
-
-
finnally
-
finally 关键字用来创建在 try 代码块后面执行的代码块。无论是否发生异常,finally 代码块中的代码总会被执行。在 finally 代码块中,可以运行清理类型等收尾善后性质的语句。
-
语法为:
try{ // 程序代码 }catch(异常类型1 异常的变量名1){ // 程序代码 }catch(异常类型2 异常的变量名2){ // 程序代码 }finally{ // 程序代码 }public class ExcepTest{ public static void main(String args[]){ int a[] = new int[2]; try{ System.out.println("Access element three :" + a[3]); }catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e); } finally{ a[0] = 6; System.out.println("First element value: " +a[0]); System.out.println("The finally statement is executed"); } } } /*输出为: Exception thrown :java.lang.ArrayIndexOutOfBoundsException: 3 First element value: 6 The finally statement is executed */

浙公网安备 33010602011771号