您的位置:首页 > 编程语言 > C语言/C++

JAVA基础篇三(Java,C++中的异常机制)

2015-08-06 10:17 417 查看
由于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!!");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java C++ 异常处理