空指针异常不是属于运行异常,无法捕获吗?

空指针异常不是属于运行异常,无法捕获吗?

在上传图片的方法,如果没有上传。会报空指针异常,而空指针异常不应该属于运行时异常。既然运行时异常无法被捕获,后面的代码应该不被执行才对啊。为什么能返回null,并且执行调用这个方法的后续代码呢?

正在回答 回答被采纳积分+1

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

6回答
提问者 慕沐3291583 2018-07-10 12:10:50

��Ϣ: Deployment of web application directory D:\soft\apache-tomcat-7.0.72\webapps\manager has finished in 113 ms

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

at java.lang.String.substring(String.java:1947)

at com.imooc.books.controller.BookServlet.receiveImage(BookServlet.java:117)

at com.imooc.books.controller.BookServlet.receiveImages(BookServlet.java:88)

at com.imooc.books.controller.BookServlet.insert(BookServlet.java:141)

at com.imooc.books.controller.BookServlet.service(BookServlet.java:59)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at com.imooc.books.filter.EncodingFilter.doFilter(EncodingFilter.java:22)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)

at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1083)

at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

at java.lang.Thread.run(Thread.java:745)



提问者 慕沐3291583 2018-07-10 12:09:59

package com.imooc.books.controller;

import com.imooc.books.entity.Book;
import com.imooc.books.entity.Category;
import com.imooc.books.service.BookService;
import com.imooc.books.service.CategoryService;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

// 申明这个Servlet是要接收大文件对象的
//@MultipartConfig
@MultipartConfig // 申明这个Servlet是要接收大文件对象的
@WebServlet("/a/book")
public class BookServlet extends HttpServlet {

   //定义业务层对象
   private BookService bookService;
   private CategoryService categoryService;


   private HttpServletRequest request;
   private HttpServletResponse response;

   @Override
   public void init() throws ServletException {
       super.init();
       //获取spring的容器,然后从容器中得到业务层对象
       ServletContext servletContext=this.getServletContext();
       WebApplicationContext context= WebApplicationContextUtils.getWebApplicationContext(servletContext);
       bookService= (BookService) context.getBean("bookService");
       categoryService=(CategoryService) context.getBean("categoryService");
   }

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       this.request=req;
       this.response=resp;
       try{
         //  request.setCharacterEncoding("UTF-8");
           String method=request.getParameter("method");
           switch (method){
               case "toInsert":
                   toInsert();
                   break;
               case "insert":
                   insert();
                   break;
               case "selectAll":
                   selectAll();
                   break;
           }
       }catch (Exception e){
           e.printStackTrace();
       }
   }

   // /dept/toInsert.do /dept_insert.jsp
   public void toInsert() throws ServletException, IOException {
       List<Category> categories=categoryService.selectById(null);
       request.setAttribute("categories",categories);
       request.getRequestDispatcher("../add_book.jsp").forward(request,response);
   }





   private List<String>  receiveImages() {
           // 如果用户上传了这里代码是不会出现异常 了
           // 如果没有上传这里出现异常
           List<String> filenames=new ArrayList<String>();
       try {
           for (Part part : request.getParts()) {
               if (part.getName().equals("smallImg")) {
                   String fileName = receiveImage(part);
                   filenames.add(fileName);
               }
           }
       } catch (IOException e) {
           e.printStackTrace();
       } catch (ServletException e) {
           e.printStackTrace();
       }

       return filenames;

   }


   private String receiveImage(Part part) {
       String fileName = null;
       try{
           // 如果用户上传了这里代码是不会出现异常 了
           // 如果没有上传这里出现异常

                   // 保存到项目的路径中去
                   String sysPath = request.getSession().getServletContext().getRealPath("/images/books");
                   // 定义一个新的图片名称
                   fileName= UUID.randomUUID().toString() ;
                   //  提取图片的类型
                   // 上传文件的内容性质
                   String contentDispostion = part.getHeader("content-disposition");
                   // 获取上传文件的后缀名
                   String suffix = contentDispostion.substring(contentDispostion.lastIndexOf("."), contentDispostion.length() - 1);
                   fileName+=suffix ;
                   // 把图片保存到路径中去
//                    System.out.println("suffix:"+suffix +" sysPath:"+sysPath+" fileName:"+fileName);
                   part.write(sysPath+"/"+fileName);

           return fileName;
       }catch (Exception e){
           e.printStackTrace();
           return null ;
       }
   }




   public void insert() throws ServletException, IOException {
       // 接收界面提交的参数
       // 获取请求参数 ----普通表单元素
       try {
           String[] name = request.getParameterValues("name");
           String[] categoryId = request.getParameterValues("categoryId");
           String[] level = request.getParameterValues("level");
           String[] price = request.getParameterValues("price");
           List<String> smallImg = receiveImages();


//            System.out.println("smallImg:" + smallImg.length);
           List<Book> books = new ArrayList<Book>();

           if(null!=smallImg&& smallImg.size()>0){
               for (int i = 0; i < name.length; i++) {
                   // 定义一个商品对象封装界面提交的参数
                   Book book = new Book();
                   // 接收用户可能上传的封面
                   book.setName(name[i]);
                   book.setCategoryId(Long.parseLong(categoryId[i]));
                   book.setLevel(Integer.parseInt(level[i]));
                   book.setPrice(Integer.parseInt(price[i]));
                   if (smallImg.get(i) != null) {
                       book.setImgPath(smallImg.get(i).toString());
                   } else {
                       book.setImgPath(null);
                   }

                   books.add(book);
               }
           }


           bookService.insert(books);
           request.setAttribute("tip", "添加成功");

       }catch (Exception e){
           e.printStackTrace();
           request.setAttribute("tip", "添加失败");
       }
       toInsert();
   }

   public void selectAll()  {
       try {
           String id= request.getParameter("id");
           Long cid=null;
           if(null!=id && id.trim().length()!=0){
               cid= Long.parseLong(id);
           }
           List<Book> books =bookService.selectById(cid);
           List<Category> categories=categoryService.selectById(null);

           request.setAttribute("categories",categories);
           request.setAttribute("books",books);
           request.getRequestDispatcher("../book.jsp").forward(request,response);
       }catch (Exception e){
           e.printStackTrace();
       }

   }



}

提问者 慕沐3291583 2018-07-10 12:09:53
提问者 慕沐3291583 2018-07-09 16:00:59

private Object[] receiveImages() {
           // 如果用户上传了这里代码是不会出现异常 了
           // 如果没有上传这里出现异常
           List<String> filenames=new ArrayList<String>();
       try {
           for (Part part : request.getParts()) {
               if (part.getName().equals("smallImg")) {
                   String fileName = receiveImage(part);

#######################3.异常后继续执行#############################                                filenames.add(fileName);
               }
           }
       } catch (IOException e) {
           e.printStackTrace();
       } catch (ServletException e) {
           e.printStackTrace();
       }

       return filenames.toArray();

   }


   private String receiveImage(Part part) {
       String fileName = null;
       try{
           // 如果用户上传了这里代码是不会出现异常 了
           // 如果没有上传这里出现异常

                   // 保存到项目的路径中去
                   String sysPath = request.getSession().getServletContext().getRealPath("/images/books");
                   // 定义一个新的图片名称
                   fileName= UUID.randomUUID().toString() ;
                   //  提取图片的类型
                   // 上传文件的内容性质

#######################1.异常#############################

                   String contentDispostion = part.getHeader("content-disposition");
                   // 获取上传文件的后缀名
                   String suffix = contentDispostion.substring(contentDispostion.lastIndexOf("."), contentDispostion.length() - 1);
                   fileName+=suffix ;
                   // 把图片保存到路径中去
//                    System.out.println("suffix:"+suffix +" sysPath:"+sysPath+" fileName:"+fileName);
                   part.write(sysPath+"/"+fileName);

           return fileName;
       }catch (Exception e){
           e.printStackTrace();

#######################2.异常返回#############################

           return null ;
       }
   }



提问者 慕沐3291583 2018-07-04 08:29:20

http://img1.sycdn.imooc.com//climg/5b3c14c4000152cc11210454.jpg在上传图片的方法,如果没有上传。会报空指针异常,而空指针异常不应该属于运行时异常。既然运行时异常无法被捕获,后面的代码应该不被执行才对啊。为什么能返回null,并且执行调用这个方法的后续代码呢?

  • 你捕获异常后,你的catch块中有个return null呀;你的报错信息定位的是哪一行,你把你的报错信息帖全,另外建议同学可以通过断点的方式跟踪一下,看看代码的执行过程;同学再次贴代码时,不要截图,直接把类中代码都粘贴出来,方便运行你的代码帮助你解答~
    2018-07-04 10:33:19
  • 提问者 慕沐3291583 回复 一叶知秋519 #2
    我的意思是,既然空指针异常属于不可以捕获的异常类型,为什么catch还能捕获到还能return。
    2018-07-09 11:57:28
  • 好帮手慕珊 回复 提问者 慕沐3291583 #3
    运行时异常不是不能用catch捕获,而是运行时异常是因为程序中的bug引起的,不是简单使用try-catch就能处理,而是需要找到程序的bug并改正,祝学习愉快!
    2018-07-09 15:08:00
一叶知秋519 2018-07-02 14:00:35

建议同学把你的代码贴一下,无法根据你的描述脑补代码~

  • 提问者 慕沐3291583 #1
    已经帖出来了
    2018-07-09 16:01:17
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
SSM主流框架入门与综合项目实战2018版
  • 参与学习           人
  • 提交作业       205    份
  • 解答问题       4317    个

Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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