【问题标题】:java.lang.NullPointerException when run on Tomcat 8, iterating filesjava.lang.NullPointerException 在 Tomcat 8 上运行时,迭代文件
【发布时间】:2016-07-10 09:23:06
【问题描述】:

我正在使用 Tomcat 8 构建一个项目。我想计算目录中所有文件中的单词数。我编写了一个函数,并希望发出一个 Rest Api GET 请求来运行该函数并返回计数。但是当我使用 PostMan 测试 API 调用时遇到了 NullPointerException。当我在本地运行该功能时,它运行良好。但是同样的功能不能在Tomcat 8服务器上运行。

以下是报错-

Servlet.service() for servlet [api.wordNum] in context with path [/Test] threw exception
java.lang.NullPointerException
    at api.WordCountHandler.countWords(WordCountHandler.java:78)
    at api.wordNum.doGet(wordNum.java:30)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
    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:745)

以下是我的代码 -

public static int countWords() {
    File dir = new File("src/testfiles/");
    int count = 0;
    for (File file : dir.listFiles()) {
        try {
            Scanner s;
            s = new Scanner(file);
            while (s.hasNext()) {
                count++;
            }
            s.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    System.out.println(count);
    return count;
}

API 调用 -

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    int result = WordCountHandler.countWords();
    response.getWriter().append(Integer.toString(result));
}

NullPointerException 发生在这一行-

for (File file : dir.listFiles()) {

【问题讨论】:

    标签: java servlets nullpointerexception tomcat8


    【解决方案1】:

    如果此抽象路径名不表示目录,则方法 listFiles 将返回 null。 src/testfiles/ 存在吗?也许您应该包含文件系统根目录的完整路径。如果不这样做,则此相对路径位于代码所在的目录下。

    您应该在循环之前包含一行测试dir.exists(),如果不存在则抛出适当的错误。

    【讨论】:

    • 谢谢,我把路径名改成绝对路径后问题解决了。
    【解决方案2】:

    可能是相对路径的问题。首先尝试使用绝对文件路径。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2016-06-04
      • 2018-11-06
      • 2019-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多