空指针异常

空指针异常

FoodDaoImpl.java  改动:在servlet中使用注解,设置了url和启动加载级数。添加了db的get方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package com.imooc.demo.java;
import java.util.ArrayList;
import java.util.List;
/**
 * 菜品数据处理类
 * @author m1318
 *
 */
public class FoodDaoImpl {
 //存放菜品对象的全局静态容器List
 private static final List<Food> foodList = new ArrayList<Food>();
  
 //foodList的get方法
 public static List<Food> getFoodlist() {
  return foodList;
 }
  
 //添加菜品
 public void addFood(Food food) {
  //判断要添加的food对象是否为空
  if(food != null) {
   //food对象不为空,添加到foodList中
   foodList.add(food);
  }
 }
  
 //查询所有菜品信息
 public List<Food> getAllFood(){
  //返回全局容器foodList
  List<Food> fl = new ArrayList<Food>();
  for(Food food : foodList) {
   fl.add(food);
  }
  return fl;
 }
  
 //根据菜品名称查询菜品信息
 public Food getFoodByName(String foodName) {
  //遍历foodList,以获取每个元素的foodName
  for(Food food : foodList) {
   //判断要查找的菜品名是否存在
   if(foodName.equals(food.getFoodName())) {
    //存在该菜品名,返回该菜品对象。结束后续代码运行
    return food;
   }
  }
  //程序执行至此,说明没有找到对应的food对象,因此返回null
  return null;
 }
  
 //根据菜品id查询菜品信息
 public Food getFoodById(String id) {
  //遍历foodList,以获取每个元素的foodId
  for(Food food : foodList) {
   //判断要查找的菜品ID是否存在
   if(id.equals(food.getFoodId())) {
    //存在该菜品ID,返回该菜品对象。结束后续代码运行
    return food;
   }
  }
  //程序执行至此,说明没有找到对应的food对象,因此返回null
  return null;
 }
  
 //根据菜品ID修改菜品
 public void updateFood(Food newFood) {
  //取得要修改菜品的ID
  String foodId = newFood.getFoodId();
  //遍历foodList
  for(Food food : foodList) {
   //根据获取到的Id,找到对应的元素
   if(foodId.equals(food.getFoodId())) {
    //将newFood中要修改的信息赋值给原来的菜品
    //newFood中除foodId属性外其它不为null的属性,即为要更新的,否则不予以更新
     
    //foodName更新判断
    if(newFood.getFoodName() != null && newFood.getFoodName() != "") {
     food.setFoodName(newFood.getFoodName());
     System.out.println("菜名已更新");
    }
    //price更新判断
    if(newFood.getPrice() != 0.0) {
     food.setPrice(newFood.getPrice());
    }
    //taste更新
    if(newFood.getTaste() != null && newFood.getTaste() != "") {
     food.setTaste(newFood.getTaste());
     System.out.println("口味已更新");
    }
    //description更新
    if(newFood.getDescription() != null && newFood.getDescription() != "") {
     food.setDescription(newFood.getDescription());
    }
    //path更新
    if(newFood.getPath() != null && newFood.getPath() != "") {
     food.setPath(newFood.getPath());
    }
   }
  }
 }
  
 // 根据菜品ID进行删除
 public void deleteFoodById(String id) {
  for (Food food : foodList) {
   //根据id找到对应的元素
   if(id.equals(food.getFoodId())) {
    //移除该该元素
    foodList.remove(food);
    //移除成功,结束遍历
    break;
   }
  }
 }
// public static void main(String[] args) {
//  Food food = new Food("f01","宫保鸡丁",36.5f,"旧口味","旧描述",null);
//  Food newfood = new Food("f01","辣子鸡",0.0f,"","好吃不贵",null);
//  FoodDaoImpl impl = new FoodDaoImpl();
//  impl.addFood(food);
//  impl.updateFood(newfood);
// }
}

FoodAddServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package com.imooc.demo.servlet;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.imooc.demo.java.Food;
import com.imooc.demo.utils.FileUploadUtil;
/**
 * 添加菜品Servlet
 */
@WebServlet("/add")
public class FoodAddServlet extends HttpServlet {
 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
  try {
   //定义一个字符串,用以存放文件上传后的完整路径 
   String url = null;
   //定义一个map容器,存放一次请求表单项的名称与值
   Map<String,String> fileItemMap = new HashMap<String,String>();
   //创建磁盘文件项工厂
   DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
   //创建核心解析类
   ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
   //解析request请求,返回fileItem的集合
   List<FileItem> fileItemList = servletFileUpload.parseRequest(request);
   //遍历fileItemList集合,判断其中的元素是普通表单项还是文件上传项
   for (FileItem fileItem : fileItemList) {
    //判断fileItem是否为普通表单项
    if(fileItem.isFormField()) {
     //普通表单项
     //取得表单项的name属性值
     String fileItemName = fileItem.getName();
     //取得表单项中的值
     String fileItemValue = fileItem.getString();
     //将表单项加入到FileItemMap中
     fileItemMap.put(fileItemName, fileItemValue);
    }else {
     //文件上传项
     //取得文件上传名
     String fileName = fileItem.getName();
     //如果文件名不为空(即未上传文件)且不为空字符串,则进行上传工作
     if(fileName != null && fileName.equals("")) {
      //获得唯一文件名
      String uuidFileName = FileUploadUtil.getUUIDFileName(fileName);
      //取得文件数据
      InputStream is = fileItem.getInputStream();
      //获取文件上传路径
      String path = this.getServletContext().getRealPath("/upload");
      //将输入流与输出流对接
      url = path + "\\" + uuidFileName;
      OutputStream os = new FileOutputStream(url);
      int len = 0;
      byte[] b = new byte[1024];
      while((len = is.read(b)) != -1) {
       os.write(b, 0, len);
      }
      is.close();
      os.close();
     }
    }
   }
   //从ServletContext域中,获取存放菜品对象的集合
   List<Food> foodList =(List<Food>) this.getServletContext().getAttribute("list");
   //遍历集合,检查新添加的菜品是否存在
   for(Food food : foodList) {
    if(food.getFoodId().equals(fileItemMap.get("id"))) {
     request.setAttribute("msg""菜品ID已经存在!");
     request.getRequestDispatcher("/addFood.jsp").forward(request, response);
    }
    if(food.getFoodName().equals(fileItemMap.get("foodName"))) {
     request.setAttribute("msg""菜品名已经存在!");
     request.getRequestDispatcher("/addFood.jsp").forward(request, response);
    }
   }
   //封装数据到Food对象中去
   Food food = new Food(fileItemMap.get("id"), fileItemMap.get("foodName"), Integer.parseInt(fileItemMap.get("price")), fileItemMap.get("taste"), fileItemMap.get("description"), fileItemMap.get("path"));
   foodList.add(food);
   this.getServletContext().setAttribute("list", foodList);
   request.getSession().setAttribute("food", food);
   response.sendRedirect(request.getContextPath()+"/showFoodList.jsp");
  catch (FileUploadException e) {
   e.printStackTrace();
  }
   
 }
 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  this.doGet(request, response);
 }
}

InitServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.imooc.demo.servlet;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import com.imooc.demo.java.Food;
import com.imooc.demo.java.FoodDaoImpl;
/**
 * 菜品添加初始化Servlet
 */
@WebServlet(urlPatterns="/init",loadOnStartup=2)
public class InitServlet extends HttpServlet {
 /**
  * 菜品添加初始化方法
  */
 public void init(ServletConfig config) throws ServletException {
  this.getServletContext().setAttribute("list", FoodDaoImpl.getFoodlist());
 }
}

http://img1.sycdn.imooc.com//climg/5d4151560001718914600218.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,报空指针的是foodList集合吗?建议同学输出一下foodList,查看是否为空。另外这里需要定义初始化菜品的init()方法,直接将菜品添加到db中,对db进行操作即可。

祝:学习愉快~

好帮手慕阿满 2019-07-31 18:57:43

同学你好,报错提示错误在FooAddSevrlet的85行,建议同学具体指出第85行是那句代码。另外FoodDaoImpl类不需要变成Servlet。添加菜品时,应该使用FoodDaoImpl类中的addFood()方法添加菜品。获取所有菜品时,使用getAllFood()方法获取所有菜品信息。

祝:学习愉快~

  • 提问者 懒人13 #1
    报错代码块 //遍历集合,检查新添加的菜品是否存在 for(Food food : foodList) { if(food.getFoodId().equals(fileItemMap.get("id"))) { request.setAttribute("msg", "菜品ID已经存在!"); request.getRequestDispatcher("/addFood.jsp").forward(request, response); } if(food.getFoodName().equals(fileItemMap.get("foodName"))) { request.setAttribute("msg", "菜品名已经存在!"); request.getRequestDispatcher("/addFood.jsp").forward(request, response); } }
    2019-07-31 19:52:35
提问者 懒人13 2019-07-31 16:46:08

尝试将FoodDaoImpl.java改为Servlet也报相同的错误。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package com.imooc.demo.java;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
/**
 * 菜品数据处理类
 * @author m1318
 *
 */
@WebServlet(urlPatterns="/init",loadOnStartup=2)
public class FoodDaoImpl extends HttpServlet{
 //存放菜品对象的全局静态容器List
 private static final List<Food> foodList = new ArrayList<Food>();
  
// //foodList的get方法
// public static List<Food> getFoodlist() {
//  return foodList;
// }
 // 菜品添加初始化方法
 public void init(ServletConfig config) throws ServletException {
  this.getServletContext().setAttribute("list", foodList);
 }
  
 //添加菜品
 public void addFood(Food food) {
  //判断要添加的food对象是否为空
  if(food != null) {
   //food对象不为空,添加到foodList中
   foodList.add(food);
  }
 }
  
 //查询所有菜品信息
 public List<Food> getAllFood(){
  //返回全局容器foodList
  List<Food> fl = new ArrayList<Food>();
  for(Food food : foodList) {
   fl.add(food);
  }
  return fl;
 }
  
 //根据菜品名称查询菜品信息
 public Food getFoodByName(String foodName) {
  //遍历foodList,以获取每个元素的foodName
  for(Food food : foodList) {
   //判断要查找的菜品名是否存在
   if(foodName.equals(food.getFoodName())) {
    //存在该菜品名,返回该菜品对象。结束后续代码运行
    return food;
   }
  }
  //程序执行至此,说明没有找到对应的food对象,因此返回null
  return null;
 }
  
 //根据菜品id查询菜品信息
 public Food getFoodById(String id) {
  //遍历foodList,以获取每个元素的foodId
  for(Food food : foodList) {
   //判断要查找的菜品ID是否存在
   if(id.equals(food.getFoodId())) {
    //存在该菜品ID,返回该菜品对象。结束后续代码运行
    return food;
   }
  }
  //程序执行至此,说明没有找到对应的food对象,因此返回null
  return null;
 }
  
 //根据菜品ID修改菜品
 public void updateFood(Food newFood) {
  //取得要修改菜品的ID
  String foodId = newFood.getFoodId();
  //遍历foodList
  for(Food food : foodList) {
   //根据获取到的Id,找到对应的元素
   if(foodId.equals(food.getFoodId())) {
    //将newFood中要修改的信息赋值给原来的菜品
    //newFood中除foodId属性外其它不为null的属性,即为要更新的,否则不予以更新
     
    //foodName更新判断
    if(newFood.getFoodName() != null && newFood.getFoodName() != "") {
     food.setFoodName(newFood.getFoodName());
     System.out.println("菜名已更新");
    }
    //price更新判断
    if(newFood.getPrice() != 0.0) {
     food.setPrice(newFood.getPrice());
    }
    //taste更新
    if(newFood.getTaste() != null && newFood.getTaste() != "") {
     food.setTaste(newFood.getTaste());
     System.out.println("口味已更新");
    }
    //description更新
    if(newFood.getDescription() != null && newFood.getDescription() != "") {
     food.setDescription(newFood.getDescription());
    }
    //path更新
    if(newFood.getPath() != null && newFood.getPath() != "") {
     food.setPath(newFood.getPath());
    }
   }
  }
 }
  
 // 根据菜品ID进行删除
 public void deleteFoodById(String id) {
  for (Food food : foodList) {
   //根据id找到对应的元素
   if(id.equals(food.getFoodId())) {
    //移除该该元素
    foodList.remove(food);
    //移除成功,结束遍历
    break;
   }
  }
 }
// public static void main(String[] args) {
//  Food food = new Food("f01","宫保鸡丁",36.5f,"旧口味","旧描述",null);
//  Food newfood = new Food("f01","辣子鸡",0.0f,"","好吃不贵",null);
//  FoodDaoImpl impl = new FoodDaoImpl();
//  impl.addFood(food);
//  impl.updateFood(newfood);
// }
}


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
从网页搭建入门Java Web2018版
  • 参与学习           人
  • 提交作业       1088    份
  • 解答问题       10204    个

如果你有Java语言基础,又想以后从事Java Web开发,那么本路径是你的不二选择!本路径从网页搭建开始入手,通过大量案例来学习Java Web基础。定能助你完成Java Web小白的蜕变!

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码