“异常对象的生命周期”及“匿名对象抛出和引用接收的最优操作”

“异常对象的生命周期”及“匿名对象抛出和引用接收的最优操作”

主题

  • 讨论异常中对象的生命周期,以及最优的异常接受方式
#include<iostream>
using namespace std;
class Maker {
public:
	Maker() {
		cout << "Maker的构造" << endl;
	}
	Maker(const Maker& m) {
		cout << "Maker的拷贝构造" << endl;
	}
	~Maker() {
		cout << "~Maker的析构" << endl;
	}
};
//-----------------------------------------------------------------------------------
//产生三个对象
void func1() {
	Maker m;	//第一个对象,在异常接受前被释放
	throw m;	//第二个对象,是第一个对象拷贝过来的
}

void test01() {
	try {
		func1();
	}
	catch(Maker m1){	//第三个对象,是第二个对象拷贝过来的
		cout << "接受一个Maker类型的异常" << endl;
		//第二个和第三个对象在catch结束时释放
	}
}
//输出:
//Maker的构造
//Maker的拷贝构造
//Maker的拷贝构造
//~Maker的析构
//接受一个Maker类型的异常
//~Maker的析构
//~Maker的析构

//----------------------------------------------------------------------------------
//产生两个对象
void func2() {
	//第一个对象
	throw Maker();
	//匿名对象,虽然通常说匿名对象的结束在当前行,但通过输出语句可看到,此匿名对象的释放并不在当前行,
	//此时的匿名对象被throw返回,暗地里实际已有名字了,有名则存
}
void test02() {
	try {
		func2();
	}

	catch (Maker m1) {		//第二个对象,从第一个对象拷贝而来
		cout << "接受一个Maker类型的异常" << endl;
		//第1个和第2个对象在catch结束时释放了
	}
}
//输出
//Maker的构造
//Maker的拷贝构造
//接受一个Maker类型的异常
//~Maker的析构
//~Maker的析构

//---------------------------------------------------------------------------------------------
//以上操作比较耗费内存,常用这一个,只生成一个对象
void func3() {
	throw Maker();//匿名对象
}
void test03() {
	try {
		func3();
	}
	catch (Maker& m1) {	
		//引用接收,不能用指针接受,会宕掉,因为编译器不允许对栈中的匿名对象取地址操作
		//但编译器允许对堆区中的匿名对象取地址操作,见test04()
		cout << "接受一个Maker类型的异常" << endl;
		//对象释放
	}
}
//输出:
//Maker的构造
//接受一个Maker类型的异常
//~Maker的析构

//---------------------------------------------------------------------
void func4() {
//    throw Maker();	//错误,若非要用指针接受,需要在堆区开辟一个对象
	throw new Maker();//匿名对象
}
void test04() {
	try {
		func4();
	}
	catch (Maker* m1) {
		cout << "接受一个Maker类型的异常" << endl;
		//对象释放
		delete m1;
	}
}
//输出:
//Maker的构造
//接受一个Maker类型的异常
//~Maker的析构
//--------------------------------------------------------------------------
//总上所述,最适合用匿名对象和引用来抛出接受
int main(void)
{
	test04();
	return 0;
}

总结

  • 通过以上代码,可以看出,通过匿名对象和引用来抛出异常进行接收是比较适当的。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的对象生命周期是指对象从创建到销毁的整个过程。对象生命周期包括以下几个阶段: 1. 创建阶段:通过关键字`new`创建对象,并分配内存空间。在这个阶段,对象的实例变量被赋予默认值,构造方法被调用,对象的状态被初始化。 2. 使用阶段:在对象创建后,可以通过调用对象的方法来使用它。在这个阶段,对象可以执行各种操作,处理数据等。 3. 引用阶段:对象可以被其他变量引用,以便在代码中持续使用对象可以被多个变量引用,或者作为方法的参数传递给其他方法。 4. 终止阶段:当对象不再被引用时,垃圾回收器会自动回收对象所占用的内存空间。在这个阶段,垃圾回收器会调用对象的`finalize()`方法来清理资源和执行一些必要的操作。 类生命周期对象生命周期有一些不同之处。类生命周期是指类从加载到卸载的整个过程。类生命周期包括以下几个阶段: 1. 加载阶段:当程序需要使用某个类时,Java虚拟机会根据类的全限定名(Fully Qualified Name)来查找并加载对应的类文件。在加载阶段,Java虚拟机会执行一些必要的验证和准备工作。 2. 连接阶段:连接阶段分为验证、准备和解析三个步骤。验证阶段用于确保类文件的字节流符合Java虚拟机规范,准备阶段用于为类的静态变量分配内存并给其赋予初始值,解析阶段用于将符号引用转换为直接引用。 3. 初始化阶段:在初始化阶段,类的静态变量会被赋予程序中指定的值,静态代码块会被执行。如果类的初始化涉及到其他类,那么这些类也会被先进行初始化。 4. 使用阶段:在类初始化完成后,可以通过类名来访问类的静态成员,并可以创建该类的对象进行实例操作。 5. 卸载阶段:当类不再被使用时,Java虚拟机会卸载该类,并释放相关的资源。 总结起来,对象生命周期是指对象从创建到销毁的过程,而类生命周期是指类从加载到卸载的过程。对象与类的生命周期密切相关,对象的创建需要依赖类的加载和初始化,而对象的销毁可能触发类的卸载。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值