老师打开http://localhost:8080/admin/Catalog/list.do空指针异常

老师打开http://localhost:8080/admin/Catalog/list.do空指针异常

java.lang.NullPointerException

at com.imooc.icake.global.DaoFactory.getDao(DaoFactory.java:27)

at com.imooc.icake.biz.Impl.CatelogBizImpl.<init>(CatelogBizImpl.java:12)

at com.imooc.icake.controller.CatalogController.<init>(CatalogController.java:16)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

at java.lang.Class.newInstance(Class.java:442)

at com.imooc.icake.global.GlobalController.service(GlobalController.java:52)

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

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

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

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

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

at com.imooc.icake.global.EncodingFilter.doFilter(EncodingFilter.java:25)

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

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

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

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

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

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

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

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)

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

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

at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616)

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1634)

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

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:748)

java.lang.NullPointerException

at com.imooc.icake.global.DaoFactory.getDao(DaoFactory.java:27)

at com.imooc.icake.biz.Impl.CatelogBizImpl.<init>(CatelogBizImpl.java:12)

at com.imooc.icake.controller.CatalogController.<init>(CatalogController.java:16)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

at java.lang.Class.newInstance(Class.java:442)

at com.imooc.icake.global.GlobalController.service(GlobalController.java:52)

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

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

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

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

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

at com.imooc.icake.global.EncodingFilter.doFilter(EncodingFilter.java:25)

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

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

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

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

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

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

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

at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)

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

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

at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:616)

at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)

at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:831)

at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1634)

at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

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:748)

04-Feb-2021 14:26:18.557 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory 把web 应用程序部署到目录 [E:\jar包\tomcat\apache-tomcat-8.5.61\webapps\manager]

04-Feb-2021 14:26:18.572 信息 [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Web应用程序目录[E:\jar包\tomcat\apache-tomcat-8.5.61\webapps\manager]的部署已在[15]毫秒内完成


正在回答

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

2回答

同学你好,这里需要去掉try中的SqlSessionFactory,三个sessionFactory是同一个对象,try中的sessionFactory是初始化sessionFactory,如果try中重新定义了sessionFactory,那么getDao()方法中的sessionFactory没有初始化,也就是null,使用其调用方法时就会出现空指针异常。

http://img1.sycdn.imooc.com//climg/601ba49d0987cadf06450487.jpg

祝学习愉快~

好帮手慕阿满 2021-02-04 15:07:21

同学你好,报错提示是空指针异常,错误出现在DaoFactory类的27行,getDao()方法中,如:

http://img1.sycdn.imooc.com//climg/601b9c860900bb1a07540139.jpg

​建议同学检查一下sessionFactory是否正确加载,如:

http://img1.sycdn.imooc.com//climg/601b9cf8092ba64412310542.jpg

如果同学检查没错,建议同学将代码贴上来,另外建议将项目展开截图贴一下。

祝学习愉快~

  • 提问者 慕九州5281120 #1
    package com.imooc.icake.global;

    import org.apache.ibatis.io.Resources;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.apache.ibatis.session.SqlSessionFactoryBuilder;

    import java.io.IOException;

    public class DaoFactory {
    private static DaoFactory daoFactory;
    private SqlSessionFactory sessionFactory;
    private DaoFactory(){
    SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
    try {
    SqlSessionFactory sessionFactory = sessionFactoryBuilder.build(Resources.getResourceAsReader("/mybatis.xml"));
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    public static DaoFactory getInstance(){
    if (daoFactory == null)
    daoFactory = new DaoFactory();
    return daoFactory;
    }

    public <T> T getDao(Class<T> tClass){
    return sessionFactory.openSession(true).getMapper(tClass);
    }
    }


    2021-02-04 15:16:09
  • 提问者 慕九州5281120 #2
    package com.imooc.icake.controller;

    import com.imooc.icake.biz.CatalogBiz;
    import com.imooc.icake.biz.Impl.CatelogBizImpl;
    import com.imooc.icake.entity.Catalog;

    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;

    public class CatalogController {

    private CatalogBiz catalogBiz = new CatelogBizImpl();

    // /admin/Catalog/list.do
    public void list(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Catalog root = catalogBiz.getRoot();
    request.setAttribute("root",root);
    request.getRequestDispatcher("/WEB-INF/pages/admin/catalog_list.jsp").forward(request,response);
    }
    // /admin/Catalog/toAdd.do
    public void toAdd(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
    Catalog root = catalogBiz.getRoot();
    request.setAttribute("root",root);
    request.getRequestDispatcher("/WEB-INF/pages/admin/catalog_add.jsp").forward(request,response);
    }
    // /admin/Catalog/add.do
    public void add(HttpServletRequest request,HttpServletResponse response) throws IOException {
    String[] titles = request.getParameterValues("title");
    String[] pids = request.getParameterValues("pid");
    String[] infos = request.getParameterValues("info");
    List<Catalog> list = new ArrayList<Catalog>();
    for (int i = 0;i < titles.length;i++){
    Catalog catalog = new Catalog();
    catalog.setTitle(titles[i]);
    catalog.setPid(Integer.getInteger(pids[i]));
    catalog.setInfo(infos[i]);
    list.add(catalog);
    }
    catalogBiz.add(list);
    response.sendRedirect("list.do");
    }
    // /admin/Catalog/remove.do
    public void remove(HttpServletRequest request,HttpServletResponse response) throws IOException {
    int id = Integer.parseInt(request.getParameter("id"));
    catalogBiz.remove(id);
    response.sendRedirect("list.do");
    }
    }


    2021-02-04 15:16:33
  • 提问者 慕九州5281120 #3
    package com.imooc.icake.global;

    import javax.servlet.GenericServlet;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.lang.reflect.Method;

    public class GlobalController extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    /*
    * .do
    * /login.do DefaultController login
    * /Cake/detail.do CakeController detail
    * /admin/Cake/add.do CakeController add
    * */

    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    String path = request.getServletPath();
    if (path.indexOf("/admin") != -1){
    path = path.substring(7);
    }else {
    path = path.substring(1);
    }


    /*
    login.do DefaultController login
    Cake/detail.do CakeController detail
    Cake/detail.do CakeController add
    * */

    int index = path.indexOf("/");
    String className = null;
    String methodName = null;
    if (index != -1){
    className = "com.imooc.icake.controller."+path.substring(0,index)+"Controller";
    methodName = path.substring(index+1,path.indexOf(".do"));
    }else {
    className = "com.imooc.icake.controller.DefaultController";
    methodName = path.substring(0,path.indexOf(".do"));
    }

    try {
    Class cla = Class.forName(className);
    Object object = cla.newInstance();
    Method method = cla.getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
    method.invoke(object,request,response);
    }catch (Exception e){
    e.printStackTrace();
    }

    }
    }


    2021-02-04 15:17:03
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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