我之前遇到的问题是这样子的,创建了User类的一个实例user,用于接收接口所返回的数据,其中findUserById为接口中的函数,在接口中使用SQL语句进行查询,通过get(0)返回查询结果集合中的第一个元素。具体代码如下


User user = userMapper.findUserById(loginName,password).get(0);


但是这样会遇到这样的情况:如果接口中SQL语句未查询到数据,显然这边的get(0)为空,此时系统虽然不会中断,但会抛出java.long.nullpointerexception 空指针异常。这是非常常见的,我们可以通过以下方法解决:


try { 
    User user = userMapper.findUserById(loginName,password).get(0);
    //若以上抛出空指针异常(即catch事件),则之后的代码不会执行
    return 1;
}catch (NullPointerException e) {
    return 0;
}


以上即最常用的try、catch Java异常处理方式。Java程序在执行过程中如果出现异常,会自动生成一个异常对象,该异常对象将被自动提交给JVM,当JVM接收到异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这一过程称为捕获(catch)异常。

在这里我们这么使用的好处是:查询用户信息成功时返回1,当查询失败时也不会单单只抛出空指针异常而是会进入异常处理块catch,然后返回0给前端。

 

 

另外我在实现的同一用户不重复预约这一功能的时候,使用了越界异常捕获。

背景是每成功预约一次都向总预约数据库和今日预约数据库中添加一条记录,SQL操作在reserveMapper接口中:

reserveMapper.insertDatatoday(userId, build, room, seat, starttime, deadtime);//今日预约数据库
reserveMapper.insertData(userId, build, room, seat, starttime, deadtime);//总预约数据库


为了防止重复预约,我们可以采用空指针异常捕获,即先查询今日预约数据库,若无异常抛出则说明已经预约,若有异常抛出则说明无预约,对此的写法大家可以参照上文空指针异常捕获的代码仿写一下。

而我为了多尝试,这里用了越界异常捕获,原理是,先向今日预约数据库中添加一条记录,然后通过数据库查询语句进行查询。如果该用户数据集中只有一条记录则说明原先无预约,可插入,由于此时今日预约数据库中已经插入,所以直接再插入总预约数据库即可;若不止一条记录,则说明原先有预约,不可再执行总预约数据库插入预约数据操作。(总预约数据库永久保留,今日预约数据库订单完成后会自动删除记录)

具体代码如下


reserveMapper.insertDatatoday(userId, build, room, seat, starttime, deadtime);//率先插入
try { //利用捕获异常处理空指针问题等 用于处理重复预订位置的问题
    Reserve reserve = reserveMapper.findID(userId).get(1);//get(1)为了知道数据库中是否存在多条数据
    return 0;
}catch (IndexOutOfBoundsException e) {//只存在一条数据,get(1)存在越界异常,异常抛出后捕获
    reserveMapper.insertData(userId, build, room, seat, starttime, deadtime);//谨防空指针问题
    ......
    return 1;
}


前端收到0则意味着用户重复预约,收到1则意味着该次预约成功。