---------------------- ASP.Net+Android+IOS开发、.NET培训、期待与您交流! ----------------------
一、 异常的概念及java异常的体系结构
- 异常的概念:程序在运行时出现不正常的情况。Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。
Java异常体系结构呈树状
Thorwable类所有异常和错误的超类,有两个子类Error和Exception,分别表示错误和异常。
其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常,在java中,异常分为两种,一种是runtime异常(RunTimeException),也就是运行时异常,这种异常是不需要捕获的,由java虚拟机自动捕获,另外一种是非运行时异常,就是除了RunTimeException类和它的子类以外的所有异常类都是非运行时异常,这种非运行时异常都是需要手动捕获的,当然实际开发中,抛异常是不行的,所以得用try{}catch(){}finally{}这样的语句块来捕获异常.
运行时异常和非运行时异常
运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,
这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,
程序应该从逻辑角度尽可能避免这类异常的发生。
非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。
从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。
二、异常的捕获和处理
java异常处理涉及到5个关键字,分别是try、catch、finally、throw、throws
1、异常处理的基本语法
在java中异常处理的完整代码
try{
//尝试运行的代码
}catch(Exception e){
//捕获到的异常代码
}
finally{
//异常发生,方法返回前,总是要执行的代码
}
try语句块,表示要尝试运行代码,try语句块中代码受异常监控,其中代码发生异常时,会抛出异常对象。
catch语句块会捕获try代码块中发生的异常并在其代码块中做异常处理,catch语句带一个Throwable类型的参数,
表示可捕获异常类型。当try中出现异常时,catch会捕获到发生的异常,并和自己的异常类型匹配,
若匹配,则执行catch块中代码,并将catch块参数指向所抛的异常对象。catch语句可以有多个,
用来匹配多个中的一个异常,一旦匹配上后,就不再尝试匹配别的catch块了。
通过异常对象可以获取异常发生时完整的JVM堆栈信息,以及异常信息和异常发生的原因等。
finally语句块是紧跟catch语句后的语句块,这个语句块总是会在方法返回前执行,
而不管是否try语句块是否发生异常。并且这个语句块总是在方法返回前执行。
目的是给程序一个补救的机会。这样做也体现了Java语言的健壮性。
2、三者之间的配对方式:
配对方式一:
try{
}catch(){
}
配对方法二:
try{
}catch(){
}finally{
}
配对方法三:
try{
}finally{
}
所以可用看出
catch和finally都不是必须的,try和catch不是必须配对的
但如果有try 就必须选一个配对 ,可以是catch 也可以是finally,或者两个都选
三者之间的执行顺序
1> try语句没有错误的话,执行try语句,然后跳转到finally语句
2> try语句有错误的话,执行catch中的语句,然后跳转到finally
3> try语句没有错误的话,先执行try语句,如果try体中有return,则先跳转finally语句,然后再执行try中的return语句
就是说无论怎样,finally中的语句都会执行
例如:
public class TestException
{
public static void main(String[] args)
{
int a = 9;
int b = 0;
System.out.println(method3(a,b));
}
public static int method3(int a,int b){
try
{
return a / b;
}
catch (ArithmeticException e)
{
System.out.println("除数不能为0!");
return 2 * 3;
}
finally{
System.out.println("finally语句");
}
}
}
Finally语句
6
3、throw、throws关键字
throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,
则还应该在方法头部声明方法可能抛出的异常类型。该方法的调用者也必须检查处理抛出的异常。
如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。
如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。有关异常的转译会在下面说明。
throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,
该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,
而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。下面给出一个简单例子,
看看如何使用这两个关键字:
public Test() throws RepletException {
try{
System.out.println("Test this Project!")
}catch(Exception e){
throw new Exception(e.toString());
}
}
throws是用来声明一个方法可能抛出的所有异常信息throw则是指抛出的一个具体的异常类型。
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,
而在方法(类)内部通过throw声明一个具体的异常信息。
throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛
程序1:
public class TestException1
{
public static void main(String[] args){
try
{
method1();
}
catch (Exception e)
{
System.out.println("m");
}
System.out.println("n");
}
public static void createException(){
throw new ArrayIndexOutOfBoundsException();
}
public static void method1(){
try
{
createException();
}
catch (ArithmeticException e)
{
System.out.println("b");
}
finally{
System.out.println("c");
}
System.out.println("d");
}
}
程序2:
public class TestException2
{
public static void main(String[] args)
{
try
{
method2();
}
catch (Exception e)
{
System.out.println("m");
}
System.out.println("n");
}
public static void createException(){
throw new ArrayIndexOutOfBoundsException();
}
public static void method2(){
try
{
createException();
}
catch (ArrayIndexOutOfBoundsException e)
{
System.out.println("b");
}
finally{
System.out.println("c");
}
System.out.println("d");
}
}
三、异常处理一般原则
---------------------- ASP.Net+Android+IOS开发、.NET培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net