两种语言都使用try , catch和throw关键字进行异常处理,并且try , catch和free块的含义在两种语言中也相同。以下是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++语言容易。有关默认异常处理程序的更多详细信息,请参阅此。