首页 > 数据库 > 数据库开发技术 > 文件上传时空指针异常解析
戳下方卡片,回复暗号【Java面试题】即可获取大厂面试题

我们知道,文件上传是企业开发中很常见的一个功能,但有些朋友在文件上传时经常会遇到一些异常情况,今天我们就来分析一下常见的空指针异常。
比如最近九哥有个学生,在使用Servlet提供的Part接口实现文件上传时,就遇到了空指针异常NullPointerException,该异常可以说是java开发中最为常见的,但不同场景下却有着截然不同的解决方案。


通过调试,我们发现表单数据在后台Servlet中无法被获取到,所有字段全部为null值。

这个现象是怎么产生的呢?后来九哥查看了Part接口进行文件上传的API方法及其使用步骤,发现文档中要求我们,必须在实现文件上传的Servlet上添加一个@MultipartConfig注解,否则服务器代码就无法使用 getPart()方法,同时y也会影响普通字段的数据获取。


为了解决上述问题,我们在使用Part接口实现文件上传时需要注意以下事项:
1.前端页面表单必须使用post请求方式;
2.表单的form标签中必须添加enctype="multipart/form-data",如下图所示:

前端实例代码如下所示:
<%--
此处必须注意:
1. method="post"提交方式必须使用post
2. enctype="multipart/form-data" 添加属性,且值必须是multipart/form-data
--%>
<form action="addbook" method="post" enctype="multipart/form-data">
<table border="1px" cellpadding="10" cellspacing="0" align="center">
<caption>
<h2>添加图书信息</h2>
</caption>
<tr>
<td>书名:</td>
<td><input type="text" name="title"></td>
</tr>
<tr>
<td>价格:</td>
<td><input type="text" name="price"></td>
</tr>
<tr>
<td>作者:</td>
<td><input type="text" name="author"></td>
</tr>
<tr>
<td>封面:</td>
<td><input type="file" name="pic"></td>
</tr>
<tr>
<td>图书简介:</td>
<td>
<textarea name="desc" cols="40" rows="5"></textarea>
</td>
</tr>
<tr align="center">
<td colspan="2">
<input type="submit" name="sub">
<input type="reset" name="ret">
</td>
</tr>
</table>
</form>3.还要在实现文件上传的Servlet中添加@MultipartConfig注解:

@WebServlet("/addbook")
@MultipartConfig
public class BookServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决请求和响应的中文乱码问题
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//获取字段属性的值
String title = req.getParameter("title");
String price = req.getParameter("price");
String author = req.getParameter("author");
String desc = req.getParameter("desc");
//调用getPart("pic")方法获取Part对象,注意参数为页面中file表单元素的name属性名
Part part = req.getPart("pic");
//获取上传文件名
String fileName = part.getSubmittedFileName();
//解决命名冲突问题
String pic = UUID.randomUUID()+fileName;
//拼接上传文件路径
String path ="E:\\path\\"+ pic;
//上传操作
part.write(path);
//构建图书对象
Book bk = new Book(title,Double.parseDouble(price),author,pic,desc);
BookService bs = new BookService();
//调用业务层方法完成添加新图书操作
int row = bs.addBook(bk);
if (row>0){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
}
}只要大家按照以上步骤,我们就可以解决文件上传时的空指针异常了,现在你学会了吗?关注Java架构栈,干货天天都不断哦!
原文作者:Java架构栈;如有侵权,请联系管理员删除。