由于C++和JAVA有很多相似之处,又有很多细微的差别,所以在学习JAVA的过程中对两种语言进行对比学习。
1、C++的异常机制
C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,由它调用abort终止程序。这样的异常处理方法使得异常引发和处理机制分离,而不在同一个函数中处理。这使得底层函数只需要解决实际的任务,而不必过多考虑对异常的处理,而把异常处理的任务交给上一层函数去处理。
C++的异常处理机制有3部分组成:try(检查),throw(抛出),catch(捕获)。把需要检查的语句放在try模块中,检查语句发生错误,throw抛出异常,发出错误信息,由catch来捕获异常信息,并加以处理。一般throw抛出的异常要和catch所捕获的异常类型所匹配。异常处理的一般格式为:
try
{
被检查语句
throw 异常
}
catch(异常类型1)
{
进行异常处理的语句1
}
catch(异常类型2)
{
进行异常处理的语句2
}
#include <iostream> #include <cstdlib> using namespce std; class MyException{}; void f(int)throw(MyException); // throw(MyException)是可选的;(比之于java),如果throw(),则表示不抛出任何异常 int main() { try{ f(0); } catch(MyException &e){ // 参数列表里可以只有类型,不包括对象(比之于java) cout<<"捕捉到异常"; } return 0; } void f(int j)throw(MyException) { throw MyException(); }
2、JAVA的异常机制
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。
其中异常类Exception又分为 运行时异常(RuntimeException)和非运行时异常,这两种异常有很大的区别,也称之为不检查异常(Unchecked Exception)和检查异常(Checked Exception)。下面将详细讲述这些异常之间的区别与联系:
(1)、Error与Exception Error是程序无法处理的错误,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。 Exception是程序本身可以处理的异常,这种异常分两大类运行时异常和非运行时异常。程序中应当尽可能去处理这些异常。
(2)、运行时异常和非运行时异常
运行时异常都是RuntimeException类及其子类异常,如NullPointerException、 IndexOutOfBoundsException等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引 起的,程序应该从逻辑角度尽可能避免这类异常的发生。
非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不 处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异 常。
Java异常处理涉及到五个关键字,分别是:try、catch、finally、throw、throws。
在java中,异常处理的完整语法是:
try{
//(尝试运行的)程序代码
}catch(异常类型 异常的变量名){
//异常处理代码
}
finally{
//异常发生,方法返回之前,总是要执行的代码
}
throw关键字是用于方法体内部,用来抛出一个Throwable类型的异常。如果抛出了检查异常,则还应该在方法头部声明方法可能抛出的异常类型。该 方法的调用者也必须检查处理抛出的异常。如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出
的是Error或RuntimeException,则该方法的调用者可选择处理该异常。有关异常的转译会在下面说明。 throws关键字用于方法体外部的方法声明部分,用来声明方法可能会抛出某些异常。仅当抛出了检查异常,该方法的调用者才必须处理或者重新抛出该异常。 当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣一般在catch块中打印一下堆栈信息做个勉强处理。
简单示列(拷贝别人的,懒得写):
package code; class MyException extends Exception { public void f() { System.out.println("this is my Exception!!"); } } public class ExceptionTestTwo { private int i = 0; private int j; ExceptionTestTwo(int x) throws MyException { f2(); j = x / i; } public void f2() throws MyException { System.out.println("this is My first Exception!!"); throw new MyException(); } public static void main(String[] args) { try { new ExceptionTestTwo(9); } catch (MyException e2) { e2.f(); } catch (Exception e) { e.printStackTrace(); } finally { System.out.println("Finally is first Exception!!"); } try { throw new MyException(); } catch (MyException e1) { e1.f(); } finally { System.out.println("Finally is second Exception!!"); } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。