C++ 和 Java 中的默认虚拟行为有何不同及其异常处理的比较

简介: 在 C++ 中,类成员方法默认是非虚拟的。可以使用virtual关键字将它们设为虚拟。例如,Base::show() 在以下程序中是非虚拟的,并且程序打印 “Base::show() called”

这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战


一、C++ 和 Java 中的默认虚拟行为有何不同

方法的默认虚拟行为在 C++ 和 Java 中是相反的:


在 C++ 中,类成员方法默认是非虚拟的。可以使用virtual关键字将它们设为虚拟。例如,Base::show() 在以下程序中是非虚拟的,并且程序打印 “Base::show() called”

#include<iostream>
using namespace std;
class Base {
public: 
  void show() {
    cout<<"Base::show() called";
  }
};
class Derived: public Base {
public: 
  void show() {
    cout<<"Derived::show() called";
  } 
};
int main()
{
Derived d;
Base &b = d;
b.show();
getchar();
return 0;
}
复制代码


Base::show() 的定义之前添加virtual使程序打印 “Derived::show() called”****

在 Java 中,方法默认是虚拟的,可以通过使用final关键字使其成为非虚拟的。例如,在


下面的java程序中,show() 默认是虚拟的,程序打印 “Derived::show() called”

class Base {
  public void show() {
  System.out.println("Base::show() called");
  }
}
class Derived extends Base {
  public void show() {
  System.out.println("Derived::show() called");
  }
}
public class Main {
  public static void main(String[] args) {
    Base b = new Derived();;
    b.show();
  }
}
复制代码


与 C++ 非虚拟行为不同,如果我们在Base 中的 show() 定义之前添加final,那么上述程序将无法编译。**


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


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


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

#include <iostream>
using namespace std;
int main()
{
int x = -1;
try {
  if( x < 0 )
  {
    throw x;
  }
}
catch (int x ) {
  cout << "发生异常:抛出的值为" << x << endl;
}
getchar();
return 0;
}
复制代码

输出:发生异常:抛出的值为 -1


2) 在 C++ 中,有一个称为“catch all”的特殊捕获,可以捕获所有类型的异常。


#include <iostream>
using namespace std;
int main()
{
int x = -1;
char *ptr;
ptr = new char[256];
try {
  if( x < 0 )
  {
    throw x;
  } 
  if(ptr == NULL)
  {
    throw " ptr is NULL ";
  }
}
catch (...) // catch all
{
  cout << "发生异常:退出"<< endl;
  exit(0);
}
getchar();
return 0;
}
复制代码


输出:


发生异常:退出


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


catch(Exception e){
…….
}
复制代码

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


class Test extends Exception { }
class Main {
public static void main(String args[]) {
  try {
    throw new Test();
  }
  catch(Test t) {
    System.out.println("得到测试异常");
  }
  finally {
    System.out.println("在 finally 块里");
  }
}
}
复制代码


输出:


得到测试异常
在 finally 块里
复制代码

4) 在 C++ 中,所有异常都是未经检查的。在 Java 中,有两种类型的异常 - 已检查和未检查。


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


6) 在 C++ 中,如果没有捕获到异常,则异常处理子系统会调用函数 unknown(),它会异常终止程序或应用程序。如果在我们的 C++ 程序中出现任何异常,那么查找该特定异常将非常耗时,因为在 C++ 中unexpected() 并没有告诉我们异常发生在哪种类型和哪一行。


但是在 Java 中,如果系统生成的异常没有被捕获,那么 Java 运行时系统 (JVM) 会将异常对象移交给默认的异常处理程序,它基本上会打印名称、描述以及异常发生在哪一行。


因此在 Java 中查找和处理异常比在 C++ 语言中更容易。


如果你发现任何不正确的内容,或者你想分享有关上述主题的更多信息,请发表评论。



目录
相关文章
|
1月前
|
Java 开发者
Java中的异常处理:从基础到高级
在Java编程的世界里,异常处理是一块基石,它确保了程序的健壮性和稳定性。本文将带你从异常的基础概念出发,逐步深入到高级处理技巧,通过实例展示如何在Java中有效管理和处理异常。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
1月前
|
Java 程序员
Java编程中的异常处理:从基础到高级
在Java的世界中,异常处理是代码健壮性的守护神。本文将带你从异常的基本概念出发,逐步深入到高级用法,探索如何优雅地处理程序中的错误和异常情况。通过实际案例,我们将一起学习如何编写更可靠、更易于维护的Java代码。准备好了吗?让我们一起踏上这段旅程,解锁Java异常处理的秘密!
|
20天前
|
存储 算法 安全
基于红黑树的局域网上网行为控制C++ 算法解析
在当今网络环境中,局域网上网行为控制对企业和学校至关重要。本文探讨了一种基于红黑树数据结构的高效算法,用于管理用户的上网行为,如IP地址、上网时长、访问网站类别和流量使用情况。通过红黑树的自平衡特性,确保了高效的查找、插入和删除操作。文中提供了C++代码示例,展示了如何实现该算法,并强调其在网络管理中的应用价值。
|
1月前
|
Java Android开发 C++
Java和C++
Java和C++
47 15
|
1月前
|
Java
Java 异常处理:11 个异常处理最佳实践
本文深入探讨了Java异常处理的最佳实践,包括早抛出晚捕获、只捕获可处理异常、不忽略异常、抛出具体异常、正确包装异常、记录或抛出异常但不同时执行、不在finally中抛出异常、避免用异常控制流程、使用模板方法减少重复代码、抛出与方法相关的异常及异常处理后清理资源等内容,旨在提升代码质量和可维护性。
|
1月前
|
安全 Java 数据库连接
Java中的异常处理:理解与实践
在Java的世界里,异常处理是维护代码健壮性的守门人。本文将带你深入理解Java的异常机制,通过直观的例子展示如何优雅地处理错误和异常。我们将从基本的try-catch结构出发,探索更复杂的finally块、自定义异常类以及throw关键字的使用。文章旨在通过深入浅出的方式,帮助你构建一个更加稳定和可靠的应用程序。
39 5
|
1月前
|
Java 程序员
深入理解Java异常处理机制
Java的异常处理是编程中的一块基石,它不仅保障了代码的健壮性,还提升了程序的可读性和可维护性。本文将深入浅出地探讨Java异常处理的核心概念、分类、处理策略以及最佳实践,旨在帮助读者建立正确的异常处理观念,提升编程效率和质量。
142 1
|
1月前
|
Java 开发者 UED
深入探索Java中的异常处理机制##
本文将带你深入了解Java语言中的异常处理机制,包括异常的分类、异常的捕获与处理、自定义异常的创建以及最佳实践。通过具体实例和代码演示,帮助你更好地理解和运用Java中的异常处理,提高程序的健壮性和可维护性。 ##
61 2
|
1月前
|
Java 开发者
Java中的异常处理机制深度剖析####
本文深入探讨了Java语言中异常处理的重要性、核心机制及其在实际编程中的应用策略,旨在帮助开发者更有效地编写健壮的代码。通过实例分析,揭示了try-catch-finally结构的最佳实践,以及如何利用自定义异常提升程序的可读性和维护性。此外,还简要介绍了Java 7引入的多异常捕获特性,为读者提供了一个全面而实用的异常处理指南。 ####
63 2
|
1月前
|
Java 数据库连接 开发者
Java中的异常处理机制:深入解析与最佳实践####
本文旨在为Java开发者提供一份关于异常处理机制的全面指南,从基础概念到高级技巧,涵盖try-catch结构、自定义异常、异常链分析以及最佳实践策略。不同于传统的摘要概述,本文将以一个实际项目案例为线索,逐步揭示如何高效地管理运行时错误,提升代码的健壮性和可维护性。通过对比常见误区与优化方案,读者将获得编写更加健壮Java应用程序的实用知识。 --- ####