不是这样的哦
空指针异常,
抛空指针异常的都是在GoddessAction类的addgoddess方法中少了 goddess.setSex(1);
goddess.setCreate_user("ADMIN"); goddess.setUpdate_user("ADMIN");
goddess.setIsdel(0);
https://github.com/jeness/J2EELearning/tree/master/jdbcEmployee
作业代码已传,欢迎批评指正
dao里调用了goddess的创建人更新人还有isdel,但是你在view里没有给它赋值啊,导致的空指针,要想解决,在Goddess.java里给这些属性赋值为null就行了,或者在view里添加通过scanner为这3个属性赋值。这个和数据库的语句没关系的,因为你的dao里的add方法里的那些?不会自动赋值的。
返回主菜单是重新查看功能列表菜单(此时程序没有结束),退出就是退出程序,程序结束。
新增成功,将对应的step重置为1;
新增成功,将对应的step重置为1;
可以的
不是有源代码下载么
package view;
import java.io.*;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import action.GodessAction;
import model.Godess;
public class View {
private static final String CONTEXT="欢迎来到女神禁区:\n" +
"下面是女神禁区的功能列表:\n" +
"[MAIN/M]:主菜单\n" +
"[QUERY/Q]:查看全部女神的信息\n" +
"[GET/G]:查看某位女神的详细信息\n" +
"[ADD/A]:添加女神信息\n" +
"[UPDATE/U]:更新女神信息\n" +
"[DELETE/D]:删除女神信息\n" +
"[SEARCH/S]:查询女神信息(根据姓名、手机号来查询)\n" +
"[EXIT/E]:退出女神禁区\n" +
"[BREAK/B]:退出当前功能,返回主菜单";
private static final String OPERATION_MAIN="MAIN";
private static final String OPERATION_QUERY="QUERY";
private static final String OPERATION_GET="GET";
private static final String OPERATION_ADD="ADD";
private static final String OPERATION_UPDATE="UPDATE";
private static final String OPERATION_DELETE="DELETE";
private static final String OPERATION_SEARCH="SEARCH";
private static final String OPERATION_EXIT="EXIT";
private static final String OPERATION_BREAK="BREAK";
public static void main(String[] args) {
System.out.println(CONTEXT);
Scanner scan = new Scanner(System.in);
Godess g = new Godess();
GodessAction ga = new GodessAction();
String previous = null;
Integer step=1;
while(scan.hasNext()) {
String input = scan.next().toString();
System.out.println("你输入的值为:"+input);
if(OPERATION_EXIT.equals(input.toUpperCase())||OPERATION_EXIT.substring(0, 1).equals(input.toUpperCase())) {
System.out.println("你已成功退出!");
break;
}else if(OPERATION_UPDATE.equals(input.toUpperCase())||OPERATION_UPDATE.substring(0, 1).equals(input.toUpperCase())) {
Godess gu= new Godess();
gu.setUser_name("小兰");
gu.setAge(30);
gu.setSex(0);
gu.setBirthday(new Date());
gu.setMobile("15648790987");
gu.setEmail("xiaolan@163.com");
gu.setIsdel(1);
gu.setId(3);
try {
ga.update(gu);
System.out.println("你已成功修改!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if(OPERATION_DELETE.equals(input.toUpperCase())||OPERATION_DELETE.substring(0, 1).equals(input.toUpperCase())) {
System.out.println("输入要删除的女神id:");
Integer id = scan.nextInt();
try {
ga.delete(id);
System.out.println("你已成功删除!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else if(OPERATION_QUERY.equals(input.toUpperCase())||OPERATION_QUERY.substring(0, 1).equals(input.toUpperCase())) {
try {
List<Godess> gds = ga.queryAll();
System.out.println("查询成功,查询结果如下:");
for(Godess gd:gds) {
System.out.println("姓名:"+gd.getUser_name()+" "+"年龄:"+gd.getAge());
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("查询失败");
}
}else if(OPERATION_ADD.equals(input.toUpperCase())||
OPERATION_ADD.substring(0, 1).equals(input.toUpperCase())||OPERATION_ADD.equals(previous)) {
previous = "ADD";
if(step==1) {
System.out.println("请输入女神的[姓名]");
}else if(step==2) {
g.setUser_name(input);
System.out.println("请输入女神的[年龄]");
}else if(step==3) {
g.setAge(Integer.valueOf(input));
System.out.println("请输入女神的[性别]");
}else if(step==4) {
g.setSex(Integer.valueOf(input));
System.out.println("请输入女神的[生日] 格式为yyyy-mm-dd");
}else if(step==5) {
SimpleDateFormat sd = new SimpleDateFormat("yyyy-mm-dd");
Date birthday = null;
try {
birthday = sd.parse(input);
g.setBirthday(birthday);
System.out.println("请输入女神的[邮箱]");
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("你输入的生日格式有误,请重新输入");
step = 4;
}
g.setBirthday(birthday);
}else if(step == 6) {
g.setEmail(input);
System.out.println("请输入女神的[手机号]");
}else if(step==7){
g.setMobile(input);
System.out.println("请输入女神的[是否删除标志]");
}else {
g.setIsdel(Integer.valueOf(input));
try {
ga.add(g);
System.out.println("新增女神成功");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("新增女神失败");
}
}
step++;
}else{
System.out.println("新增女神失败");
}
}
}
}
新建数据库的时候指定utf-8编码。
应该是DBUitl类中的 JDBC配置时区出错了
令serverTimezone=Asia/Shanghai
if (OPERATION_SEARCH.equals(a.toUpperCase()) || OPERATION_SEARCH.substring(0, 1).equals(a.toUpperCase())
|| OPERATION_SEARCH.equals(string)) {
string=OPERATION_SEARCH;
System.out.println("请输入姓名:(支持模糊查询)");
String s1=dllx.next();
System.out.println("请输入手机号码:(支持模糊查询)");
String s2=dllx.next();
List<Map<String, Object>> list2= new ArrayList<Map<String, Object>>();
Map<String, Object> map=new HashMap<String, Object>();
map.put("name", "user_name");
map.put("relation", "like");
map.put("value", "'%"+s1+"%'");
list2.add(map);
map=new HashMap<String, Object>();
map.put("name", "mobile");
map.put("relation", "like");
map.put("value", "'%"+s2+"%'");
list2.add(map);
List<Goddess> list3 = rt.query(list2);
for (Goddess god : list3) {
System.out.println(god.toString());
}
}
提示空指针异常,是因为尝试去获得空对象。视频中GoddessDao类的add方法通过传进来的Goddess类尝试调用了getCreate_user(),getUpdate_user(),getIsdel()三个方法,实际上传进来的goddess对象的这三个属性是没赋值的。
GoddessAction类中的add(Goddess goddess)方法中加上
goddess.setSex(1);
goddess.setCreate_user("ADMIN");
goddess.setUpdate_user("ADMIN");
goddess.setIsdel(0);这三个代码就行了,视频的时候没有加这个
在主菜单加一个循环判断条件,单输入为break的时候跳出循环,回答主菜单。相当于一个全局判断条件
进入更新函数时,选择需要修改的Id,根据Id调用按Id查找人物信息。对输入为null的项目跳过。
我觉得在新增模块里面一直输入信息直到信息填写完毕在跳出循环也是一个解决方案
在使用增加功能时,将OPERATION_ADD的值赋给prenious;说明了将值付给prenious时就是调用了增加的功能,所以进行step++。 反之如果不使用增加功能,就不会将OPERATION_ADD的值赋给prenious,所以不会增加进行赋值
GoddessAction.java中修改add函数
public void add(Goddess goddess) throws Exception{
GoddessDao dao=new GoddessDao();
goddess.setSex(1);
goddess.setCreate_user("ADMIN");
goddess.setUpdate_user("ADMIN");
goddess.setIsdel(0);
dao.addGoddess(goddess);
}
严肃的学习中看到这个问题还挺好玩的
因为用了try catch语句,try catch 是捕捉try部分的异常,当你没有trycatch的时候,如果出现异常则程序停止,加上trycatch,出现异常程序正常运行,只是把错误信息存储到Exception里,所以catch是用来提取异常信息的,你可以在Catch部分加上一句System.out.println(e.ToString());,如果出现异常可以把异常打印出来。
我把dao层那个给改了, 比如说性别我直接设置成1了,也就是不用赋值,只把关键信息赋值,其他的都成自动了
ptmt.setString(1,goddess.getUser_name()); ptmt.setInt(2,1);//性别 ptmt.setInt(3,goddess.getAge()); ptmt.setDate(4,new Date(goddess.getBirthday().getTime()));//这里注意会报错,因为setDate方法要求传递的是 //sql包下的date类型,java.sql.Date,因此我们要进行一波转换。new Date(goddess.getBirthday().getTime()) ptmt.setString(5,goddess.getEmail()); ptmt.setString(6,goddess.getMobile()); ptmt.setString(7,"admin");//创建人 ptmt.setString(8,"admin");//修改人 ptmt.setInt(9,0); ptmt.execute();
prenius是为了让程序保留在对应的功能模块内,step是为了控制该功能模块内的步骤。比方视频中举得是添加女神的例子,在最开始让prenius=OPRATION_ADD就是为了让下一次输入的时候控制程序进入ADD条件的模块继续对要增加的女生信息进行编辑,而step就是控制女神信息编辑的步骤,在女生出生日期的那段代码块可以体现,当时间格式错误的情况下step = 3,那么最后又有个递增使得step=4,让下一次输入重新进入出生日期的编辑。
程序最后修改掉previous的值来达到跳出add分支
字符串换成数字:Integer.valueOf(in);
因为你的女神性别啊,创建者啊等等都是空的,没有赋值,所以会这样。你把下面这段代码添加到控制层的add类里去就好了。
goddess.setSex(1);
goddess.setCreate_user("ADMIN");
goddess.setUpdate_user("ADMIN");
goddess.setIsdel(0);
完整的像这样就好了
public void add(Goddess goddess) throws Exception{
goddessDao dao =new goddessDao();
goddess.setSex(1);
goddess.setCreate_user("ADMIN");
goddess.setUpdate_user("ADMIN");
goddess.setIsdel(0);
dao.addGoddess(goddess);
}