java.lang.NullPointerException when 运行 on Tomcat 8,迭代文件

java.lang.NullPointerException when run on Tomcat 8, iterating files

我正在使用 Tomcat 构建一个项目 8. 我想计算目录中所有文件的字数。我编写了一个函数,并想向 运行 函数和 return 计数发出 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()) {

方法 listFiles returns 如果此抽象路径名不表示目录,则为 null。 src/testfiles/ 存在吗?也许您应该包括从文件系统根开始的完整路径。如果你不这样做,这个相对路径在代码所在的目录下。

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

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