空指针异常问题
------题前话,老师能不能添加个上传项目的接口啊,每次问问题都要复制代码好麻烦的啊,而且随着学习的深入,代码真的好多啊------
# 具体遇到的问题
从表单获得数据,无法添加到xml文件,但是xmlDataSource.xml文件在测试的时候是可以添加的
# 报错信息的截图

# 相关课程内容截图
# 尝试过的解决思路和结果
从报错的信息往回查看代码,但是好像没问题啊
# 粘贴全部相关代码,切记添加代码注释(请勿截图)
在这里输入代码,可通过选择【代码语言】
BookController.java package com.imooc.library.controller; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; 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.FileItemFactory; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import com.imooc.library.entity.Book; import com.imooc.library.entity.Category; import com.imooc.library.service.BookService; import com.imooc.library.service.CategoryService; import com.imooc.library.utils.CategoryModel; /** * Servlet implementation class BookController */ @WebServlet("/book") public class BookController extends HttpServlet { private static final long serialVersionUID = 1L; private BookService bookService = new BookService(); /** * @see HttpServlet#HttpServlet() */ public BookController() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String method = request.getParameter( "method" ); if( method.equals( "bookList" ) ) { this.bookList( request, response ); }else if( method.equals( "delete" ) ) { this.delete( request, response ); }else if( method.equals( "show_creat" ) ) { this.show_creat( request, response ); }else if( method.equals( "create" ) ) { this.create( request, response ); } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); } /** * 展示书籍信息 * @param request * @param response * @throws ServletException * @throws IOException */ private void bookList( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{ /** * 获得书籍并传送 */ List< Book > booksList = new ArrayList< Book >(); booksList = bookService.bookList(); request.setAttribute( "booksList", booksList ); /** * 获得分类信息 */ Map< String, String > categories = new HashMap< String, String >(); CategoryService categoryService = new CategoryService(); CategoryModel categoryModel = categoryService.categoryHashMap(); categories = categoryModel.getCategoriesMap(); System.out.println( categories ); request.setAttribute( "categoryHashMap", categories ); request.getRequestDispatcher( "/WEB-INF/jsp/bookList.jsp" ).forward(request, response); } private void delete( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{ } private void show_creat( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{ request.getRequestDispatcher( "/WEB-INF/jsp/addBook.jsp" ).forward(request, response); } private void create( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException{ //1.初始化FileUpload组件 /** * FileItemFactory 用于将前端表单的数据转换为一个个FileItem对象 * ServletFileUpload 则是为FileUpload组件提供JavaWeb的Http请求解析 */ FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload sf = new ServletFileUpload( factory ); //2.遍历所有FileItem try { //将request请求转变为FileItem的List集合 List< FileItem > formData = sf.parseRequest( request ); Book book = new Book(); for( FileItem fi : formData ) { System.out.println( fi.getFieldName() ); //判断是普通文本框还是文件上传框 true为普通项,false是文件上传框 if( fi.isFormField() ) { switch ( fi.getFieldName() ) { case "bookId": book.setBookId( fi.getString( "UTF-8" ) ); break; case "bookName": book.setBookName( fi.getString( "UTF-8" ) ); break; case "categoryId" : book.setClassifiedId( fi.getString( "UTF-8" ) ); break; case "bookPrice" : System.out.println( fi.getString() ); book.setPrice( Float.parseFloat( fi.getString( "UTF-8" ) ) ); break; case "remarks" : book.setRemark( fi.getString( ) ); break; default: break; } }else { //3.文件保存到服务器目录 //获得upload在磁盘的实际物理路径 String path = request.getServletContext().getRealPath( "/upload" ); //利用UUID随机获得字符串 String fileName = UUID.randomUUID().toString(); /** * fi.getName()用于获取上传文件的文件名 * 通过截取上传文件名的文件后缀给新文件名添加后缀 */ String suffix = fi.getName().substring( fi.getName().lastIndexOf( "." ) ); fi.write( new File( path, fileName + suffix ) ); book.setPreview( "/upload/" + fileName + suffix ); } } //新增功能 bookService.create( book ); //返回展示页 System.out.println( book ); response.sendRedirect( "/book?method=bookList"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } BookXmlDataSource.java package com.imooc.library.utils; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; import com.imooc.library.entity.Book; public class BookXmlDataSource { //通过static静态关键字保证数据全局唯一 private static List<Book> bookData = new ArrayList<Book>(); private static String bookDataFile; static { /** * 得到book.xml文件完整物理路径 */ bookDataFile = BookXmlDataSource.class.getResource( "/book.xml" ).getPath(); reloadBook(); } /** * 初始化书籍 */ private static void reloadBook() { URLDecoder decoder = new URLDecoder(); try { bookDataFile = decoder.decode( bookDataFile, "UTF-8" ); //利用Dom4j对xml进行解析 SAXReader reader = new SAXReader(); //1、获取Document文档对象 Document document = reader.read( bookDataFile ); //2、Xpath得到xml节点集合 List< Node > nodes = document.selectNodes( "/root/book" ); bookData.clear(); for( Node node : nodes ) { Element element = ( Element )node; Book book = new Book(); book.setBookId( element.elementText( "bookId" ) ); book.setBookName( element.elementText( "bookName" ) ); book.setClassifiedId( element.elementText( "classifiedId" ) ); book.setPrice( Float.parseFloat( element.elementText( "price" ) ) ); book.setPreview( element.elementText( "preview" ) ); book.setRemark( element.elementText( "remark" ) ); bookData.add( book ); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 获得所有书籍对象 * @return bookData */ public static List< Book > getBooks(){ return bookData; } public static void append( Book book ) { //1、读取XML文档,得到Document对象 SAXReader reader = new SAXReader(); Writer writer = null; try { Document document = reader.read( bookDataFile ); //2、创建新的book节点 //获得根节点<root> Element root = document.getRootElement(); //创建新的<book>节点 Element b = root.addElement( "book" ); //3、创建book节点的各个子结点 b.addAttribute( "id", String.valueOf( bookData.size() + 1 ) ); b.addElement( "bookId" ).setText( book.getBookId() ); b.addElement( "bookName" ).setText( book.getBookName() ); b.addElement( "classifiedId" ).setText( book.getClassifiedId() ); b.addElement( "price" ).setText( ( book.getPrice().toString() ) ); b.addElement( "preview" ).setText( book.getPreview() ); b.addElement( "remark" ).setText( book.getRemark() ); //4、写入XML,完成追加操作 writer = new OutputStreamWriter( new FileOutputStream( bookDataFile ) ); document.write( writer ); System.out.println( bookDataFile ); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if( writer != null ) { try { writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } reloadBook(); } // public static void main(String[] args) { // System.out.println( "增加前数量:" + bookData.size() ); // Book b = new Book(); // b.setBookId( "book0006" ); // b.setBookName( "爆笑校园" ); // b.setClassifiedId( "1" ); // b.setPrice( 10.0f ); // b.setPreview( "/img/g2.jpeg" ); // b.setRemark( "无" ); // BookXmlDataSource.append( b ); // System.out.println( "增加后数量:" + bookData.size() ); // } }突出显示
16
收起
正在回答
1回答
同学你好,根据错误提示是在
book.setPrice( Float.parseFloat( element.elementText( "price" ) ) );
代码处发生异常
Float.parseFloat()方法传入的参数为空会报空指针异常,所以可能是element.elementText("
price")返回值为空
同学检查xml文件里<price>标签的值是否有效
如果没有问题,同学将该语句拆分一下,看看是否获取到了price
先使用element.elementText( "price"获取price,并将结果进行打印
之后再使用Float.parseFloat(); 最后使用set方法
看看控制台是否报错,并结合报错信息进行定位问题
最后同学的建议小慕会反馈给相关人员
祝学习愉快
java工程师2020版
- 参与学习 人
- 提交作业 9410 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星