我收到运行时错误。它说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>
答案 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
中,您刚刚创建了一个引用但尚未实例化。因此logger
是null
当你打电话给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()); ;