【问题标题】:How to fix HTTP 500 error message in eclipse如何在 Eclipse 中修复 HTTP 500 错误消息
【发布时间】:2018-04-02 03:02:07
【问题描述】:

所以,我在 Web 应用程序中使用 Log4J 做一个简单的练习。这是我的代码:

package tot;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;

/**
 * Servlet implementation class pro
 */
@WebServlet("/pro")
public class pro extends HttpServlet {
private static final long serialVersionUID = 1L;

private Logger logg = null;

public void inut() {
    logg = Logger.getRootLogger();
    BasicConfigurator.configure();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    logg.setLevel(Level.FATAL);
    logg.debug("debug");
    logg.info("info");
    logg.warn("warn");
    logg.error("error");
    logg.fatal("fatal");


    response.setContentType("text/html");
    PrintWriter printwriter = response.getWriter();
    printwriter.println("<html>");
    printwriter.println("<head><title>log4j</title></head>");
    printwriter.println("<body>");
    printwriter.println("no config <br>");
    printwriter.println("logger name: " + logg.getName());
    printwriter.println("</body>");
    printwriter.println("</html>");
}

}

我创建了一个动态 Web 项目并使用 apache tomcat 9.0.6 运行时。我还创建了一个 servlet。当我运行我的代码时,我收到以下错误消息:

HTTP Status 500 – Internal Server Error


Type Exception Report

  Description The server encountered an unexpected condition that prevented it 
from fulfilling the request.

Exception
java.lang.NullPointerException
    tot.pro.doGet(pro.java:31)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)


Note The full stack trace of the root cause is available in the server logs.


Apache Tomcat/9.0.6

此外,控制台会打印以下错误消息:

java.lang.NullPointerException
    at tot.pro.doGet(pro.java:31)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    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:53)
    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:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Unknown Source)

我期望发生的是显示标题和正文消息的 http 页面;并且记录器消息“致命”应该打印到控制台。根据我的研究,我找到的解决方案是清除缓存、网页浏览历史记录和刷新页面(我已经完成了)。我觉得错误是由我设置服务器的方式产生的,但我找不到我做错了什么。

非常感谢任何帮助。

【问题讨论】:

  • 如果有人决定测试我的代码,我从 apache.org/dyn/closer.cgi/logging/log4j/1.2.17/log4j-1.2.17.zip 下载了 log4j jar 文件
  • 也许你的意思是public void init() { 不是inut
  • 我发誓你一定会喜欢那些完全搞砸你的代码的小错误,谢谢@scary wombat
  • 如果您使用了 @override 注释,您的 IDE 会通知您此错误

标签: java eclipse http servlets log4j


【解决方案1】:

内部服务器错误是由当您尝试访问尚未初始化的对象的属性时发生的空指针异常引起的。

在这段代码中,记录器尚未初始化:

logg.setLevel(Level.FATAL);

尚未调用 inut 方法,这意味着未初始化记录器,导致 logg 的值为 NULL。这会导致空指针异常。为了解决这个问题,您需要调用 inut() 方法,或者我们可以创建一个静态变量:

final static Logger logger = Logger.getLogger(classname.class);

有关静态变量的更多信息,请查看 What does the 'static' keyword do in a class?

【讨论】:

  • 啊是的,它奏效了。但是我现在在控制台中收到一个错误,指出“请正确初始化 log4j 系统”。似乎这是因为我没有提供附加程序而生成的(在控制台中也有说明)。请记住,我对 log4j 很陌生,但我的理解是“BasicConfigurator.configure();”语句允许您在不使用 appender/property 语句的情况下打印不同的日志消息。所以我的问题是,您可以在不使用附加程序的情况下打印日志消息吗?如果是这样,正确的格式是什么?
猜你喜欢
  • 1970-01-01
  • 2021-01-07
  • 2019-06-01
  • 2014-03-28
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多