空指针异常不是属于运行异常,无法捕获吗?
在上传图片的方法,如果没有上传。会报空指针异常,而空指针异常不应该属于运行时异常。既然运行时异常无法被捕获,后面的代码应该不被执行才对啊。为什么能返回null,并且执行调用这个方法的后续代码呢?
正在回答 回答被采纳积分+1
��Ϣ: 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)
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();
}
}
}
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 ;
}
}
- 参与学习 人
- 提交作业 205 份
- 解答问题 4317 个
Java中非常实用的SSM整合开发内容,从Spring开始,到MyBaits的进阶内容,再到SpringMVC的应用,最后是SSM整合开发案例,逐步深入,助你成长为一名Java工程师!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星