为什么selectOne会报空指针异常?又如何解决?
假设有如下方法:
public User selectUserByUsername(String username){
DBAccess dbAccess = new DBAccess();//DBAccess是用于获取sqlSession的类
SqlSession sqlSession = null;
try {
User user = new User();
sqlSession = dbAccess.getSqlSession();
user = sqlSession.selectOne("User.selectUserByUsername", username);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
return user;
}
上述代码在进行查询的时候如果没有查询到任何值,那么selectOne会返回null,并把null赋值给user对象。这样赋值的时候是不会报错的也不会有任何异常,但是当一个对象为null的时候,是不可以调用其get方法的,会出现空指针异常:
但是将null赋值给user对象的情况和不给user的任何属性set任何值的情况不一样:
可以看到,当user对象被创建出来的时候并不是null的,因此调用其get方法时会根据属性类型返回其初始值。
因此,在使用Mybatis进行查询(即使是查询单条结果)的时候,更推荐将查询结果使用List封装,用selectList方法来进行查询,好处是可以直接使用List的isEmpty方法和size方法来进行判断,并且可以避免空指针异常的麻烦。
如,将上述方法改成如下内容:
public List<User> selectUserByUsername(String username){
List<User> userList = new ArrayList<User>();
DBAccess dbAccess = new DBAccess();
SqlSession sqlSession = null;
try {
sqlSession = dbAccess.getSqlSession();
userList = sqlSession.selectList("User.selectUserByUsername", username);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(sqlSession != null){
sqlSession.close();
}
}
return userList;
}
空指针异常解决。