码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-08-06 11:12:17      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:java   c++   异常处理   

由于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基础篇三(Java,C++中的异常机制)

标签:java   c++   异常处理   

原文地址:http://blog.csdn.net/feiyangtianyao/article/details/47311405

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!