空指针异常问题

空指针异常问题

------题前话,老师能不能添加个上传项目的接口啊,每次问问题都要复制代码好麻烦的啊,而且随着学习的深入,代码真的好多啊------


# 具体遇到的问题
从表单获得数据,无法添加到xml文件,但是xmlDataSource.xml文件在测试的时候是可以添加的
# 报错信息的截图
http://img1.sycdn.imooc.com//climg/5f93ac7e090984b719201048.jpg

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

# 相关课程内容截图

# 尝试过的解决思路和结果
从报错的信息往回查看代码,但是好像没问题啊
# 粘贴全部相关代码,切记添加代码注释(请勿截图)

在这里输入代码,可通过选择【代码语言】

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() );
//     }
}

突出显示

正在回答

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

1回答

同学你好,根据错误提示是在

book.setPrice( Float.parseFloat( element.elementText( "price" ) ) );

代码处发生异常

Float.parseFloat()方法传入的参数为空会报空指针异常,所以可能是element.elementText("

price")返回值为空

同学检查xml文件里<price>标签的值是否有效

如果没有问题,同学将该语句拆分一下,看看是否获取到了price

先使用element.elementText( "price"获取price,并将结果进行打印 

之后再使用Float.parseFloat(); 最后使用set方法

看看控制台是否报错,并结合报错信息进行定位问题

最后同学的建议小慕会反馈给相关人员

祝学习愉快

  • 被抱的树 提问者 #1
    好像是ide的问题,今天下课回来重新运行就可以了,好像是里面的数据缓存被清理掉了
    2020-10-24 20:57:20
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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