【发布时间】:2023-03-30 03:50:02
【问题描述】:
我的问题可能很模糊。让我详细说明一下。 我的项目目录结构(在 IntelliJ IDEA 中):
Server/--------------------------Module
src/
java/-----------------------------------classpath directory
com.example.demo/
HelloServlet.java ------a servlet respons
TestCode.java ------a servlet that responds to network requests
Utils.java ------a class to test by junit
resources/------------------------------classpath directory
hello.txt------------------------------------------ "hello word" writed in this file
在Utils.java,我有以下代码:
public class Utils {
private static BufferedReader reader = null;
static{
try {
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("hello.txt");
reader = new BufferedReader(new InputStreamReader(is));
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getString() throws IOException {
return reader.readLine();
}
}
在TestCode.java:
public class TestCode {
@Test
public void test() throws IOException {
System.out.println(Utils.getString());
}
}
当我运行 test() 方法时,我得到以下控制台输出:
Hello World
这样可以,但是servlet有问题。
在HelloServlet.java,我有以下代码:
@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
private String message;
public void init() {
message = "init() has invoked.";
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
//NullPointerException throws
message = Utils.getString();
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
public void destroy() {
}
}
当我在doGet()方法中调用Utils.getString(),并通过chrome发送GET请求时,servlet会抛出NullPointerException。
java.lang.NullPointerException
at java.io.Reader.<init>(Reader.java:78)
at java.io.InputStreamReader.<init>(InputStreamReader.java:72)
at com.example.demo.Utils.<clinit>(Utils.java:17)
at com.example.demo.HelloServlet.doGet(HelloServlet.java:20)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
但是当我对Utils.java 进行一些更改时,如下所示:
private static BufferedReader reader = null;
static{
try {
//use getClassLoader() instead of getSystemClassLoader()
InputStream is = Utils.class.getClassLoader().getResourceAsStream("hello.txt");
reader = new BufferedReader(new InputStreamReader(is));
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getString() throws IOException {
return reader.readLine();
}
然后我通过 chrome 发送一个 GET 请求。“Hello World”将打印在浏览器上。 当我刷新网站(或再次请求 servlet)时,会出现第二个将打印 null 的问题。 为什么?有人可以回答我的问题吗?谢谢
【问题讨论】:
-
你可以试试:this.getClass().getClassLoader().getResourceAsStream()
标签: tomcat8 servlet-3.0