📜  C++和Java中异常处理的比较

📅  最后修改于: 2021-05-30 17:01:02             🧑  作者: Mango

两种语言都使用trycatchthrow关键字进行异常处理,并且trycatchfree块的含义在两种语言中也相同。以下是Java和C++异常处理之间的区别。

1)在C++中,所有类型(包括基本类型和指针)都可以作为异常抛出。但是在Java,只有可抛出对象(Throwable对象是Throwable类的任何子类的实例)可以作为异常抛出。例如,以下类型的代码在C++中有效,但类似的代码在Java不起作用。

#include 
using namespace std;
int main() 
{
   int x = -1; 
  
   // some other stuff   
   try {
      // some other stuff 
      if( x < 0 )
      {
         throw x;
      }   
   }
   catch (int x ) {
      cout << "Exception occurred: thrown value is " << x << endl;
   }
   getchar();
   return 0;
}

输出:
发生异常:抛出值为-1
2)在C++中,有一个特殊的捕获称为“全部捕获”,可以捕获各种异常。

#include 
using namespace std;
int main() 
{
   int x = -1; 
   char *ptr;
     
   ptr = new char[256];
     
   // some other stuff   
   try {
      // some other stuff 
      if( x < 0 )
      {
         throw x;
      }      
      if(ptr == NULL)
      {
         throw " ptr is NULL ";
      }   
   }
   catch (...) // catch all
   {
      cout << "Exception occurred: exiting "<< endl;
      exit(0);
   }
     
   getchar();
   return 0;
}

输出:
发生异常:正在退出

在Java,出于所有实际目的,我们可以捕获Exception对象以捕获所有类型的异常。因为,通常我们不捕获异常(错误)以外的Throwable。

catch(Exception e){
  …….
}

3)在Java,有一个名为finally的块,该块总是在try-catch块之后执行。此块可用于执行清理工作。 C++中没有这样的块。

// creating an exception type
class Test extends Exception { }
  
class Main {
   public static void main(String args[]) {
  
      try {
         throw new Test();
      }
      catch(Test t) {
         System.out.println("Got the Test Exception");
      }
      finally {
         System.out.println("Inside finally block ");
      }
  }
}

输出:

Got the Test Exception
Inside finally block

4)在C++中,所有异常均未选中。在Java,有两种类型的异常-已检查和未检查。有关已检查和未检查的异常的更多详细信息,请参见此内容。

5)在Java,新的关键字throws用于列出函数可以抛出的异常。在C++中,没有throws关键字,为此目的也使用了相同的关键字throw

6)在C++中,如果未捕获到异常,则异常处理子系统将调用函数unexpant(),这将异常终止程序或应用程序。如果在我们的C++程序中发生任何异常,则发现该特定异常非常耗时,因为在C++中,unexpanted()不会告诉我们该异常发生在哪种类型和发生在哪一行。有关unexpant()的更多详细信息,请参考此。但是在Java,如果没有捕获到系统生成的异常,则Java运行时系统(JVM)将异常对象移交给默认的异常处理程序,该异常处理程序基本上会打印名称,描述以及发生异常的那一行。因此,在Java查找和处理异常要比C++语言容易。有关默认异常处理程序的更多详细信息,请参阅此。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”