在第41行

时间:2015-11-22 12:40:10

标签: java

我收到运行时错误。它说loggermanager.java中有空指针异常。

org.apache.jasper.JasperException:在第41行处理JSP页面/AddMemberAction.jsp时发生异常

38:      }
39:      catch(Exception e)
40:      { 
41:        LoggerManager.writeLogWarning(e);
42:      }
43:      response.sendRedirect("ViewProjectMembers.jsp");
44:     %>


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:575)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:477)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)


root cause 

java.lang.NullPointerException
    com.dts.core.util.LoggerManager.writeLogWarning(LoggerManager.java:58)
    org.apache.jsp.AddMemberAction_jsp._jspService(AddMemberAction_jsp.java:135)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.jal

Loggermanager.java

package com.dts.core.util;

import java.io.File;
import java.io.PrintStream;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

public class LoggerManager {
  public static Logger logger;

  public LoggerManager() {}

  public Logger getLogger(String file) {
    String dir = file.substring(0, file.lastIndexOf("/"));
    System.out.println("-----dir----" + dir);
    logger = Logger.getLogger("Logger");
    try {
      File f = new File(dir);
      boolean success = f.exists();

      if (!success) {
        success = f.mkdir();
      }
      LogManager lm = LogManager.getLogManager();
      FileHandler fh = new FileHandler(file, true);
      logger = Logger.getLogger("LoggerManager");
      logger.setUseParentHandlers(false);
      lm.addLogger(logger);
      logger.setLevel(Level.INFO);
      fh.setFormatter(new SimpleFormatter());
      logger.addHandler(fh);

    } catch (Exception e) {

      logger.log(Level.INFO, e.toString(), e.fillInStackTrace());
    }
    return logger;
  }

  public static void writeLogInfo(Exception e) {
    logger.log(Level.INFO, e.toString(), e.fillInStackTrace());
  }

  public static void writeLogSevere(Exception e) {
    logger.log(Level.SEVERE, e.toString(), e.fillInStackTrace());
  }

  public static void writeLogWarning(Exception e) {
    logger.log(Level.WARNING, e.toString(), e.fillInStackTrace());
  }

  public static void writeLogInfo(String info) {
    logger.log(Level.INFO, info);
  }

  public static void writeLogSevere(String severe) {
    logger.log(Level.SEVERE, severe);
  }

  public static void writeLogWarning(String warning) {
    logger.log(Level.WARNING, warning);
  }
}

下面是LoggerManager.writeLogWarning(3)的源代码;在场

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ page import="com.dts.core.dao.*,com.dts.core.model.*,com.dts.core.util.*,com.dts.btisqr.model.*,com.dts.btisqr.dao.*" %>
<%@ page import="java.util.*,com.dts.dae.dao.*,com.dts.dae.model.*"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'AddMemberAction.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
   <%
     try
     {
        int projectid = Integer.parseInt(request.getParameter("projectid"));
        String member = request.getParameter("member");   
        Project aProject = new Project();
        aProject.setProjectID(projectid);
        aProject.setAssignedTo(member);

        new ProjectsDAO().assignProject(aProject);
     }
     catch(Exception e)
     { 
       LoggerManager.writeLogWarning(e);
     }
     response.sendRedirect("ViewProjectMembers.jsp");
    %>
  </body>
</html>

2 个答案:

答案 0 :(得分:0)

如果在NullPointerException类的第58行中抛出LoggerManager,则logger变量未正确初始化。 我建议添加getLogger()方法,它将执行类似这样的操作

private static Logger getLogger() {
    if (logger == null) {
        logger = Logger.getLogger("LoggerManager");
    }
    return logger;
}

然后将writeLogWarning方法改为

public static void writeLogWarning(String warning) {
    getLogger().log(Level.WARNING, warning);
}

一般来说,我认为您应该对LoggerManager课程进行一些重构。正如我所看到的,所有writeLogX()方法都是静态的,但它们使用logger变量,这显然是非静态变量。 更重要的是logger仅在一个公共方法中初始化

public Logger getLogger(String file)

这是一个实例方法。 如果LoggerManager是一个提供一组静态辅助方法的util类,或者是用于创建一些对象的可实例化类,则应该做出决定。

我建议使用第一种方法,使类完全静态。在这种情况下,您可以通过将构造函数设置为私有来隐藏构造函数,并通过在构造函数中抛出异常来保护LoggerManager免受反射实例化。

private LoggerManager() {
    throw new InstantiationException("This is an util class and should not be instantiated.");
} 

之后我建议重新考虑getLogger(String file)不应该是静态方法。我可以看到,LoggerManager的实例甚至没有一次调用,因此您只需在static之后添加public关键字。

答案 1 :(得分:0)

错误是由于没有实例化的记录器。

public static Logger logger;中的这一行LoggerManager.java中,您刚刚创建了一个引用但尚未实例化。因此loggernull

当你打电话给logger.log .....

 public static void writeLogWarning(Exception e) {
    logger.log(Level.WARNING, e.toString(), e.fillInStackTrace());
  }

因为记录器仍为空,因此抛出NullPointerException

因此,在调用logger的log()方法之前,需要先实例化

修改以下行

public static Logger logger;

public static Logger logger=Logger.getLogger(LoggerManager.class.getName()); ;