-3

I am getting a runtime error . It says that there is null pointer exception in loggermanager.java.

org.apache.jasper.JasperException: An exception occurred processing JSP page /AddMemberAction.jsp at line 41

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);
  }
}

Below is the souce code where LoggerManager.writeLogWarning(3); is present

<%@ 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>
  • I could not find this line LoggerManager.writeLogWarning(e); in your source code,I think you are missing some codes here – SpringLearner Nov 22 '15 at 12:46

2 Answers2

0

If the NullPointerException is thrown in line 58 of LoggerManager class it looks like logger variable is not initialized properly. I suggest to add getLogger() method that will do something like this

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

And after that change your writeLogWarning method to something like that

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

Generally I think that you should perform some refactoring on LoggerManager class. As I can see all writeLogX() methods are static but they uses logger variable which is clearly non-static variable. What's more logger is initialized only in one public method

public Logger getLogger(String file)

which is an instance method. You should make a decision if LoggerManager is an util class that provides a set of static helper methods or is instantiable class that will be used to create some objects.

I suggest to use the first approach and make the class fully static. In that case you can hide constructor by making it private and protect LoggerManager from beeing instantiated with reflection by throwing exception inside that constructor.

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

After that I suggest to rethink if getLogger(String file) should not be static method. As I can see there is not even a single call to the instance of LoggerManager, so you can just add static keyword after public.

Kamil
  • 2,712
  • 32
  • 39
0

The error is due to logger which is not instantiated.

In this line public static Logger logger; in LoggerManager.java you have just created a reference but you have not instantiated. So logger is null

When you are calling logger.log.....

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

as logger is still null so its throwing NullPointerException

So before you call log() methods of logger you need to instantiate first

Modify the following line

public static Logger logger;

to

public static Logger logger=Logger.getLogger(LoggerManager.class.getName()); ;
SpringLearner
  • 13,738
  • 20
  • 78
  • 116