异常处理

Java异常是一个描述在代码段中发生的异常(也就是出错)情况的对象。当异常情况发生,一个代表该异常的对象被创建并且在导致该错误的方法中被引发(throw)。该方法可以选择自己处理异常或传递该异常。两种情况下,该异常被捕获(caught)并处理。异 常可能是由Java运行时系统产生,或者是由你的手工代码产生。被Java引发的异常与违反语 言规范或超出Java执行环境限制的基本错误有关。手工编码产生的异常基本上用于报告方 法调用程序的出错状况。 Java异常处理通过5个关键字控制:try、catch、throw、throws和 finally。下面讲述它 们如何工作的。程序声明了你想要的异常监控包含在一个try块中。如果在try块中发生异常,它被抛出。你的代码可以捕捉这个异常(用catch)并且用某种合理的方法处理该异常。系 统产生的异常被Java运行时系统自动引发。手动引发一个异常,用关键字throw。任何被引发方法的异常都必须通过throws子句定义。任何在方法返回前绝对被执行的代码被放置在finally块中。

异常处理块的常用形式:

try
{
// block of code to monitor for errors
}
catch(ExceptionType1 exOb)
{
// exception handler for ExceptionType1 
}
catch (ExceptionType2 exOb) { 
 // exception handler for ExceptionType2 
 } 
 // ... 
 finally { 
 // block of code to be executed before try block ends 
 }

finally块中写入必要执行的代码,ExceptionType 是发生异常的类型。

 

异常类型

1.所有异常类型都是内置类Throwable的子类,Throwable在异常类层次结构的顶层。

2.Throwable下面的是两个把异常分成两个不同分支的子类。一个分支是Exception,另一个是Error

3.Exception用于用户程序可能捕捉的异常情况。在Exception分支中有一个重要子类RuntimeException。该类型的异常自动为你所编写的程序定义并且包括被零除和非法数组索引这样的错误

4.Error定义了在通常环境下不希望被程序捕获的异常。 Error类型的异常用于Java运行时系统来显示与运行时系统本身有关的错误。堆栈溢出是这种错误的一例,通常是灾难性的致命错误,不是程序可以控制的。

 

try-catch:

为防止和处理一个运行时错误,只需要把你所要监控的代码放进一个try块就可以了。 紧跟着try块的,包括一个说明你希望捕获的错误类型的catch子句。

class Exc2 { 
 public static void main(String args[]) { 
 int d, a; 
 try { // monitor a block of code. 
 d = 0; 
 a = 42 / d; 
 System.out.println("This will not be printed."); 
 } catch (ArithmeticException e) { // catch divide-by-zero error 
 System.out.println("Division by zero."); 
 } 
 System.out.println("After catch statement."); 
 } 
}

输出:

Division by zero.

After catch statement.

一旦异常被引发,程序控制由try块转到catch块。执行永远不会从catch块“返回”到try块。

构造catch子句的目的是解决异常情况并且像错误没有发生一样继续运行。

 

多重catch语句:

可以定义两个或更多 的catch子句,每个子句捕获一种类型的异常。当异常被引发时,每一个catch子句被依次检 查,第一个匹配异常类型的子句执行。当一个catch语句执行以后,其他的子句被旁路,执 行从try/catch块以后的代码开始继续。

// Demonstrate multiple catch statements. 
class MultiCatch { 
 public static void main(String args[]) { 
 try { 
 int a = args.length; 
 System.out.println("a = " + a); 
 int b = 42 / a; 
 int c[] = { 1 }; 
 c[42] = 99; 
 } catch(ArithmeticException e) { 
 System.out.println("Divide by 0: " + e); 
 } catch(ArrayIndexOutOfBoundsException e) { 
 System.out.println("Array index oob: " + e); 
 } 
 System.out.println("After try/catch blocks."); 
 } 
}

 

到目前为止,你只是获取了被Java运行时系统引发的异常。然而,程序可以用throw语句引发明确的异常。

throw:

形式:throw ThrowableInstance;

ThrowableInstance一定是Throwable类类型或Throwable子类类型的一个对象。简 单类型,例如int或char,以及非Throwable类,例如String或Object,不能用作异常。

程序执行在throw语句之后立即停止;后面的任何语句不被执行。

 

 

finally:

finally创建一个代码块。该代码块在一个try/catch 块完成之后另一个try/catch出现之前执行。finally块无论有没有异常引发都会执行。如果异常被引发,finally甚至是在没有与该异常相匹配的catch子句情况下也将执行。一个方法将从一个try/catch块返回到调用程序的任何时候,经过一个未捕获的异常或者是一个明确的返回语句,finally子句在方法返回之前仍将执行。这在关闭文件句柄和释放任何在方法开始时被分配的其他资源是很有用的。finally子句是可选项,可以有也可以无。然而每一个try语句至少需要一个catch或finally子句。

 

 

java的内置异常:

 

Java 的 java.lang 中定义的未检查异常子类

ArithmeticException          算术错误,如被0除

ArrayIndexOutOfBoundsException   数组下标出界

ArrayStoreException         数组元素赋值类型不兼容

ClassCastException          非法强制转换类型

IllegalArgumentException       调用方法的参数非法

IllegalMonitorStateException       非法监控操作,如等待一个未锁定线程

IllegalStateException           环境或应用状态不正确

IllegalThreadStateException       请求操作与当前线程状态不兼容

IndexOutOfBoundsException      某些类型索引越界

NullPointerException           非法使用空引用

NumberFormatException          字符串到数字格式非法转换

SecurityException              试图违反安全性

StringIndexOutOfBounds           试图在字符串边界之外索引

UnsupportedOperationException       遇到不支持的操作

 

java.lang 中定义的检查异常:

ClassNotFoundException     找不到类

CloneNotSupportedException    试图克隆一个不能实现Cloneable接口的对象

IllegalAccessException         对一个类的访问被拒绝

InstantiationException        试图创建一个抽象类或者抽象接口的对象

InterruptedException       一个线程被另一个线程中断

NoSuchFieldException         请求的字段不存在

NoSuchMethodException     请求的方法不存在

posted @ 2021-08-24 18:04  lbeaner  阅读(99)  评论(0)    收藏  举报