pointer-like classes 开放智能指针

本文介绍了C++中智能指针shared_ptr的概念及其用法,包括如何通过成员函数调用操作智能指针所指向的对象。此外,还探讨了模板迭代器的实现方式,展示了如何通过迭代器访问容器内元素。
template<class T>
class shared_ptr
{
public:
	T& operator*() const
	{ return *px; }
	T* operator->() const 
	{ return px; }
	shared_ptr(T* p): px(p) {}
private:
	T * px;
	long* pn;
}
struct Foo
{
	void method(void);
}
shared_ptr<Foo> sp(new Foo)
Foo f(*sp)
sp->method();---->px->method();

pointer-like classes 开放迭代器

template<class T,class Ref, class Ptr>
struct _list_iterator{
	typedef _list
}

T & operator *() const{
	return (*node).data;
}

T* operator->() const{
	return &(operator*());
}
"D:\java\IntelliJ IDEA 2019.2.4\jbr\bin\java.exe" -ea -Didea.test.cyclic.buffer.size=1048576 "-javaagent:D:\java\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar=54212:D:\java\IntelliJ IDEA 2019.2.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\java\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar;D:\java\IntelliJ IDEA 2019.2.4\plugins\junit\lib\junit-rt.jar;D:\java\IntelliJ IDEA 2019.2.4\plugins\junit\lib\junit5-rt.jar;D:\java\ljj-di4\target\test-classes;D:\java\ljj-di4\target\classes;D:\MavenRepository\org\mybatis\mybatis\3.5.2\mybatis-3.5.2.jar;D:\MavenRepository\mysql\mysql-connector-java\8.0.11\mysql-connector-java-8.0.11.jar;D:\MavenRepository\com\google\protobuf\protobuf-java\2.6.0\protobuf-java-2.6.0.jar;D:\MavenRepository\junit\junit\4.12\junit-4.12.jar;D:\MavenRepository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 Test1,testGetMemberByUnameAndSex java.lang.ExceptionInInitializerError at Test1.testGetMemberByUnameAndSex(Test1.java:80) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.NullPointerException at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:52) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:36) at com.itheima.untils.MyBatisUtils.<clinit>(MyBatisUtils.java:20) ... 23 more Caused by: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.lang.NullPointerException at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:121) at org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:98) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:50) ... 25 more Caused by: java.lang.NullPointerException at org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:105) ... 27 more Process finished with exit code -1 ??? @Test public void testGetMemberByUnameAndSex(){ SqlSession session= MyBatisUtils.getSession(); MemberDaoMapper memberDaoMapper=session.getMapper(MemberDaoMapper.class); List<Member> memberList=memberDaoMapper.getMemberByUnameAdnSex("李四",0); for(Member member:memberList){ System.out.println(member); } session.close(); }???<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.mapper.MemberDaoMapper"> <!-- 插入会员(主键自增,不指定member_id) --> <insert id="insert" parameterType="com.itheima.pojo.Member" keyProperty="member_id" useGeneratedKeys="true"> insert into ms_member(uname, password, email, sex, mobile) values (#{uname}, #{password}, #{email}, #{sex}, #{mobile}) </insert> <!-- 批量插入(无需指定member_id) --> <insert id="insert1"> insert into ms_member(uname, password, email, sex, mobile) values ('李白', '123456', 'aabb@qq.com', 0, '2434234'), ('程咬金', '123456', 'yyrry@qq.com', 0, '234324') </insert> <!-- 根据ID查询会员 --> <select id="getMemberById" resultType="com.itheima.pojo.Member"> select member_id, uname, password, email, sex, mobile from ms_member where member_id = #{member_id} </select> <!-- 查询所有会员 --> <select id="findAll" resultType="com.itheima.pojo.Member"> select * from ms_member </select> <!-- 按用户名和性别查询(方法1:参数顺序传递) --> <select id="getMemberByUnameAndSex" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{0} and sex = #{1} </select> <!-- 按用户名和性别查询(方法2:@Param注解命名参数) --> <select id="getMemberByUnameAndSex1" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{uname} and sex = #{sex} </select> <!-- 按用户名和性别查询(方法3:Map参数) --> <select id="getMemberByUnameAndSex2" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{uname} and sex = #{sex} </select> <!-- 按用户名和手机号查询(动态SQL) --> <select id="findMemberByUnameAndMobile" resultType="com.itheima.pojo.Member" parameterType="com.itheima.pojo.Member"> select * from ms_member where 1=1 <if test="uname != null and uname != ''"> and uname like concat('%', #{uname}, '%') </if> <if test="mobile != null and mobile != ''"> and mobile like concat('%', #{mobile}, '%') </if> </select> <!-- 删除会员 --> <delete id="deleteById" parameterType="Integer"> delete from ms_member where member_id = #{member_id} </delete> <!-- 更新会员 --> <update id="updateById" parameterType="com.itheima.pojo.Member"> update ms_member set uname = #{uname}, password = #{password}, email = #{email}, sex = #{sex}, mobile = #{mobile} where member_id = #{member_id} </update> </mapper>????<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.itheima.mapper.MemberDaoMapper"> <!-- insert元素(修正后) --> <insert id="insert" parameterType="com.itheima.pojo.Member" keyProperty="member_id" useGeneratedKeys="true"> insert into ms_member(uname, password, email, sex, mobile) values (#{uname}, #{password}, #{email}, #{sex}, #{mobile}) </insert> <!-- 批量插入示例 --> <insert id="insert1"> insert into ms_member(uname, password, email, sex, mobile) values ('李白', '123456', 'aabb@qq.com', 0, '2434234'), ('程咬金', '123456', 'yyrry@qq.com', 0, '234324') </insert> <!-- 根据ID查询会员 --> <select id="getMemberById" resultType="com.itheima.pojo.Member"> select member_id, uname, password, email, sex, mobile from ms_member where member_id = #{member_id} </select> <!-- 查询所有会员 --> <select id="findAll" resultType="com.itheima.pojo.Member"> select * from ms_member </select> <!-- 按用户名和性别查询(修正方法名和SQL) --> <select id="getMemberByUnameAndSex" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{uname} and sex = #{sex} </select> <select id="getMemberByUnameAndSex1" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{uname} and sex = #{sex} </select> <select id="getMemberByUnameAndSex2" resultType="com.itheima.pojo.Member"> select * from ms_member where uname = #{uname} and sex = #{sex} </select> <!-- 按用户名和手机号查询(已修正mobile条件) --> <select id="findMemberByUnameAndMobile" resultType="com.itheima.pojo.Member" parameterType="com.itheima.pojo.Member"> select * from ms_member where 1=1 <if test="uname != null and uname != ''"> and uname like concat('%', #{uname}, '%') </if> <if test="mobile != null and mobile != ''"> and mobile like concat('%', #{mobile}, '%') </if> </select> <!-- delete元素 --> <delete id="deleteById" parameterType="Integer"> delete from ms_member where member_id = #{member_id} </delete> <!-- update元素 --> <update id="updateById" parameterType="com.itheima.pojo.Member"> update ms_member set uname = #{uname}, password = #{password}, email = #{email}, sex = #{sex}, mobile = #{mobile} where member_id = #{member_id} </update> </mapper>
最新发布
06-11
<think>我们正在处理一个MyBatis框架下的异常问题,用户在执行testGetMemberByUnameAndSex测试时遇到了两个异常:`java.lang.ExceptionInInitializerError`和`NullPointerException`。根据引用的内容以及MyBatis的常见错误,我们可以逐步分析。引用[3]中提到了一些可能的错误原因:标签写错、资源绑定路径问题、配置文件不规范、空指针异常以及资源未导出等。结合用户提到的`NullPointerException`和`ExceptionInInitializerError`,我们可以重点考虑以下几个方面:1.**`ExceptionInInitializerError`**通常发生在静态初始化块或静态变量初始化时抛出异常。在MyBatis中,这可能是由于初始化`SqlSessionFactory`时出现错误,比如配置文件错误或资源路径问题。2.**`NullPointerException`**通常是因为试图访问一个空对象的成员。在MyBatis的上下文中,可能是`SqlSession`没有正确初始化,或者在获取Mapper时返回了`null`。从用户提到的`MyBatisUtils`(可能是自定义的工具类)和`SqlSessionBuilder`(实际上应该是`SqlSessionFactoryBuilder`)来看,问题可能出现在工具类的初始化上。###可能的原因和解决方案:####1.配置文件路径错误或配置错误-MyBatis的核心配置文件(如`mybatis-config.xml`)或MapperXML文件路径不正确,导致初始化时找不到文件。-检查配置文件中数据库连接参数是否正确。-确保MapperXML文件在资源目录中,且被正确注册到MyBatis配置文件中。####2.静态初始化失败-`MyBatisUtils`类中可能有静态初始化代码(静态块或静态变量初始化)。如果在这里初始化`SqlSessionFactory`时出错,就会抛出`ExceptionInInitializerError`。-检查`MyBatisUtils`的静态初始化代码,确保正确构建`SqlSessionFactory`。例如:```javapublicclassMyBatisUtils{privatestaticSqlSessionFactorysqlSessionFactory;static{try{Stringresource="mybatis-config.xml";InputStreaminputStream=Resources.getResourceAsStream(resource);sqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);}catch(IOExceptione){thrownewExceptionInInitializerError(e);}}//...}```如果`Resources.getResourceAsStream(resource)`返回`null`(即找不到配置文件),则抛出`IOException`,进而被包装成`ExceptionInInitializerError`。####3.Mapper接口未正确注册-在MyBatis中,Mapper接口需要被注册到`SqlSessionFactory`中。如果没有注册,调用`sqlSession.getMapper(XXXMapper.class)`可能返回`null`,从而后续调用方法时抛出`NullPointerException`。-确保在配置文件`mybatis-config.xml`中正确配置了Mapper,例如:```xml<mappers><mapperclass="com.example.dao.MemberMapper"/><!--或者指定MapperXML文件--><mapperresource="com/example/dao/MemberMapper.xml"/></mappers>```####4.资源导出问题(Maven项目)-如果使用Maven构建项目,确保`src/main/resources`目录下的配置文件(包括`mybatis-config.xml`和MapperXML文件)被正确导出到类路径中。在`pom.xml`中应配置资源导出:```xml<build><resources><resource><directory>src/main/resources</directory><includes><include>**/*.xml</include></includes></resource></resources></build>```####5.其他常见问题-**数据库连接参数错误**:在配置文件中检查数据库URL、用户名和密码。-**MapperXML文件中的错误**:如SQL语句错误、标签错误、参数映射错误等,这可能会导致初始化或执行时出错。-**重复加载MyBatis核心配置文件**:确保只构建一次`SqlSessionFactory`(单例模式)。###具体解决步骤:1.**检查配置文件路径**:确保`mybatis-config.xml`在类路径的根目录下(如`src/main/resources`),并且工具类中的资源路径字符串正确。2.**检查Mapper文件注册**:在`mybatis-config.xml`中,确认是否正确注册了Mapper接口或MapperXML文件。3.**检查Maven资源导出设置**:确保配置文件被正确导出到`target/classes`下。4.**检查工具类`MyBatisUtils`**:查看静态初始化块中是否有异常被抛出,可以使用`e.printStackTrace()`打印具体错误原因。5.**在测试方法中捕获异常**:为了定位问题,可以在测试方法中加入更详细的日志或异常捕获:```java@TestpublicvoidtestGetMemberByUnameAndSex(){try(SqlSessionsqlSession=MyBatisUtils.getSqlSession()){MemberMappermapper=sqlSession.getMapper(MemberMapper.class);//如果mapper为null,则抛出NullPointerExceptionMembermember=mapper.getMemberByUnameAndSex("username","male");//...}catch(Exceptione){e.printStackTrace();}}```6.**查看完整堆栈信息**:`ExceptionInInitializerError`通常是由另一个异常引起的(其`cause`属性不为空),所以需要查看完整的堆栈信息来定位根本原因。通过以上步骤,应该能够定位并解决用户的问题。如果上述步骤无法解决问题,可能需要用户提供更具体的错误堆栈信息以及相关代码(如`MyBatisUtils`工具类、配置文件等)来进一步分析。§§相关问题§§1.MyBatis中如何正确配置数据源?2.如何解决MyBatisMapperXML文件中的SQL语法错误?3.在MyBatis中,`#`和`$`在SQL参数绑定中有何区别?</think> ### 解决 MyBatis 中的 `NullPointerException` 和 `ExceptionInInitializerError` 问题 根据引用内容[1][2][3]和您描述的异常信息,这些错误通常与 **配置初始化失败**、**资源未正确加载** 或 **空对象访问** 有关。以下是分步解决方案: --- #### 问题原因分析(结合引用[3]): 1. **`ExceptionInInitializerError`** 表示静态初始化块或静态变量初始化失败(如`MyBatisUtils`初始化错误)。 2. **`NullPointerException`** 通常由以下原因导致: - SQL 映射文件(Mapper XML)未正确注册 - `SqlSession` 或 Mapper 接口未实例化 - 资源路径错误(如缺少`/`符号) - Maven 未导出 XML 文件(引用[3]提到) --- ### 解决方案步骤: #### 1. 检查 MyBatis 核心配置初始化 在 `MyBatisUtils` 中确认 `SqlSessionFactory` 是否正确构建: ```java public class MyBatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { // 重点:路径必须以 "/" 开头(引用[3]) String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { // 初始化错误抛出 ExceptionInInitializerError throw new ExceptionInInitializerError(e); } } public static SqlSession getSqlSession() { return sqlSessionFactory.openSession(); } } ``` - **错误路径示例** ❌:`com/example/config.xml` - **正确路径示例** ✅:`/com/example/config.xml`(引用[3]) --- #### 2. 验证 Mapper XML 注册(防止 NullPointer) 在 `mybatis-config.xml` 中检查映射文件路径: ```xml <configuration> <mappers> <!-- 关键:使用 / 分隔路径(引用[3]) --> <mapper resource="com/example/mapper/MemberMapper.xml"/> </mappers> </configuration> ``` --- #### 3. 处理 Maven 资源导出问题(引用[3]) 在 `pom.xml` 中添加资源导出配置: ```xml <build> <resources> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.xml</include> <!-- 导出XML文件 --> </includes> <filtering>true</filtering> </resource> </resources> </build> ``` --- #### 4. 检查测试代码(避免空对象访问) 在测试方法 `testGetMemberByUnameAndSex` 中确认 `SqlSession` 非空: ```java @Test public void testGetMemberByUnameAndSex() { try (SqlSession session = MyBatisUtils.getSqlSession()) { // 使用前验证非空(引用[1]) MemberMapper mapper = session.getMapper(MemberMapper.class); if (mapper == null) { throw new NullPointerException("Mapper is null"); } mapper.getMemberByUnameAndSex("name", "M"); } catch (Exception e) { e.printStackTrace(); } } ``` --- ### 快速排查流程: ```mermaid graph TD A[ExceptionInInitializerError] --> B[检查 MyBatisUtils 静态初始化] B --> C[验证 mybatis-config.xml 路径正确性] C --> D[Maven 是否导出 XML 文件?] D --> E[检查 mapper.getMapper() 是否返回 null] E --> F[查看堆栈日志定位空指针位置] ``` --- ### 补充建议: - **日志调试**:在 `SqlSessionFactoryBuilder.build()` 前后添加日志,确认配置文件是否成功加载。 - **异常捕获**(引用[2]):用 `try-catch` 包裹初始化代码,抛出更明确的异常信息。 - **版本检查**:确认 MyBatis 与 JDK 版本兼容(旧版 JDK 可能引发静态初始化错误)。 通过以上步骤,90% 的初始化错误和空指针问题可解决。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值