List相关 空指针 初始化

本文详细解析了在Java中使用集合时遇到的空指针异常问题,特别是当在查询课程分类及其课程列表时,如何正确初始化List集合以避免此类错误。通过实例展示了直接定义List与使用new ArrayList()初始化之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public List findByCCateNameOrCourseName(String name){

	List<QrCourseCategoryContainsCourses> qccclist = null;
	
	//先判断输入的字符是能不能找到课程分类
	QrCourseCategoriesExample cexample = new QrCourseCategoriesExample();
	com.shopx5.pojo.QrCourseCategoriesExample.Criteria cc = cexample.createCriteria();
	if (StringUtils.isNoneBlank(name)) {
		cc.andNameLike("%"+name+"%");
	}
	List<QrCourseCategories> clist = qccService.selectByExample(cexample);
	//如果分类名包含搜索词,列出所有的分类及课程
	if(clist.size()!=0) {
		for(QrCourseCategories QrCourseCategory:clist ) {
			int id = QrCourseCategory.getId();
			//直接逐条放进去就好了
			//qccclist.containsAll(showSomeByCourseCate(id));
			qccclist.addAll(showSomeByCourseCate(id));
			//qccclist.add(showSomeByCourseCate(id).get(0));
			
		}
	}

以上代码一直在“qccclist.addAll(showSomeByCourseCate(id));”报错说空指针,一直以为是集合需要字段id不为空,可以另外的类似方法能返回到参数,并没有报错;后来改了一下这个,原来是集合初始化的问题。直接定义是不行是,应该是这样写:
List qccclist = new ArrayList();

一开始因为直接定义List没报错所以也没管,初始化一定要new 新对象,小细节要注意。

<think>好的,我需要帮助用户了解C++中智能指针的初始化方法,特别是std::unique_ptr和std::shared_ptr。首先,我应该回顾一下智能指针的基本概念,确保自己理解正确。智能指针是C++11引入的,用于自动管理动态内存,防止内存泄漏。 接下来,用户需要具体的初始化方式和使用示例。对于std::unique_ptr,我记得它独占所有权,不能复制,只能移动。初始化时可以通过构造函数直接传递原始指针,或者使用std::make_unique(C++14及以上)。需要确认是否要提到C++14的make_unique,因为用户可能在使用不同版本,但一般来说,推荐使用make_unique因为更安全。 然后是std::shared_ptr,它允许多个指针共享所有权,引用计数管理内存。初始化方法包括构造函数和std::make_shared。同样,make_shared更高效,因为它在单块内存中分配控制块和对象。需要给出这两种方式的示例代码。 用户可能还需要知道如何访问指针成员,比如使用get()方法获取原始指针,或者通过operator->和operator*。此外,重置指针或释放所有权的方法,比如release()对于unique_ptr,但shared_ptr不需要,因为它使用引用计数。 需要注意正确性,比如使用模板参数时的语法,确保代码示例正确。另外,是否需要提及自定义删除器?用户的问题中没有提到,可能暂时不需要,保持回答简洁。 还要检查是否有遗漏,比如weak_ptr的初始化,但用户只问了unique和shared,所以可以忽略。然后,确保代码示例符合C++标准,语法正确,比如使用auto关键字,或者显示类型声明。 最后,生成相关问题,帮助用户进一步学习,比如不同指针的区别,内存释放时机,循环引用问题等。确保引用标记正确,根据提供的引用来源,引用[1]、[2]、[3]都是关于智能指针的使用,所以对应的部分需要添加引用标识。 总结步骤: 1. 概述智能指针的作用。 2. 分别说明unique_ptr和shared_ptr的初始化方法,每种方法给出示例代码。 3. 提及推荐的做法,如使用make_unique和make_shared。 4. 添加访问和释放的注意事项。 5. 生成相关问题。 6. 在适当的位置添加引用标记,如初始化方法提到C++11引入时引用[1][2][3]。 现在,将这些内容组织成结构清晰的回答,使用代码块展示示例,并确保语言准确无误。</think>### C++智能指针的初始化及使用方式 #### 1. `std::unique_ptr` 的初始化 `std::unique_ptr` 是一种独占所有权的智能指针,确保同一时间只有一个指针管理资源[^3]。 **初始化方法:** - **直接构造**:通过 `new` 创建对象。 ```cpp std::unique_ptr<int> ptr1(new int(42)); ``` - **使用 `std::make_unique`**(C++14及以上推荐): ```cpp auto ptr2 = std::make_unique<int>(42); ``` - **转移所有权**:通过 `std::move` 转移。 ```cpp auto ptr3 = std::move(ptr1); // ptr1 变为空指针 ``` **示例:** ```cpp #include <memory> #include <iostream> int main() { // 初始化方式1 std::unique_ptr<std::string> str_ptr(new std::string("Hello")); std::cout << *str_ptr << std::endl; // 输出: Hello // 初始化方式2(C++14+) auto num_ptr = std::make_unique<double>(3.14); std::cout << *num_ptr << std::endl; // 输出: 3.14 } ``` --- #### 2. `std::shared_ptr` 的初始化 `std::shared_ptr` 允许多个指针共享资源,通过引用计数管理内存[^2][^3]。 **初始化方法:** - **直接构造**: ```cpp std::shared_ptr<int> ptr4(new int(100)); ``` - **使用 `std::make_shared`**(推荐,更高效): ```cpp auto ptr5 = std::make_shared<int>(100); ``` - **拷贝构造**:共享所有权。 ```cpp auto ptr6 = ptr5; // 引用计数+1 ``` **示例:** ```cpp #include <memory> #include <iostream> int main() { // 初始化方式1 std::shared_ptr<std::vector<int>> vec_ptr(new std::vector<int>{1, 2, 3}); std::cout << vec_ptr->size() << std::endl; // 输出: 3 // 初始化方式2(推荐) auto list_ptr = std::make_shared<std::list<std::string>>(); list_ptr->push_back("C++"); std::cout << list_ptr->front() << std::endl; // 输出: C++ } ``` --- #### 关键注意事项 1. **资源访问**:通过 `operator*` 或 `operator->` 访问对象。 2. **释放资源**: - `std::unique_ptr` 离开作用域时自动释放。 - `std::shared_ptr` 引用计数归零时释放[^1]。 3. **避免循环引用**:`std::shared_ptr` 需结合 `std::weak_ptr` 解决循环引用问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值