jdk1.7 下当代码仅多加一个try-catch时就会报错,不知道为什么

发布于 2021-11-30 13:22:30 字数 2719 浏览 859 评论 4

Environment: jdk1.7
javax.servlet-api-3.0.1.jar is needed for this test.
Reproduce steps:
javac Test1.java -cp javax.servlet-api-3.0.1.jar build Test1.java with javax.servlet-api-3.0.1.jar

javac Test2.java -cp javax.servlet-api-3.0.1.jar build Test2.java with javax.servlet-api-3.0.1.jar

javac Test3.java build Test3.java
But when this command java Test3 run, Exception is thrown. The result at the end of this post.
Test1.hello()运行正常,而Test2.hello()运行失败
Test1.java
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
public class Test1 {
    public void getRequest(HttpServletResponse resp) throws IOException {
        OutputStream os = resp.getOutputStream();
        resp.getOutputStream().close();
    }
    public void hello(String world) {
        System.out.println("hello " + world);
    }
}
Test2.java
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
public class Test2 {
    public void getRequest(HttpServletResponse resp) throws IOException {
        OutputStream os = resp.getOutputStream();
        try {
            resp.getOutputStream().close();
        } catch (Exception e) {
        }
    }
    public void hello(String world) {
        System.out.println("hello " + world);
    }
}
Test3.java
public class Test3 {
    public static void main(String[] args) {
        new Test1().hello("world1");
        new Test2().hello("world2");
    }
}
output of the final step. Test2.hello("world2") throw an exception:
hello world1
Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream
    at cn.test.abc1.Test3.main(Test3.java:9)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
Caused by: java.lang.ClassNotFoundException: javax.servlet.ServletOutputStream
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 6 more
I am very confused with the Exception. Because I didn't use any code in the Class ServletOutputStream. And the difference of the Test1 and Test2 is only a try blocked.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

无声静候 2021-12-03 14:11:17

一点建议。
你catch住的是一个Exception。而你抛出的是一个IOException,Exception是所有异常的父类。catch不住的才会抛出,但Exception的话,会catch住所有的异常。Throws IOException其实是走不到的。

正常的话应该是这样的:

public void getRequest(HttpServletResponse resp) throws Exception{
。。。

           if( os != null){

            try{

                  os.close();

        } catch(IOException ioe){

            //do nothing.

        }

    }

}

os

浅沫记忆 2021-12-03 06:10:59

你修改成

throws Exception

试试看

你修改成

throws Exception

试试看

悟红尘 2021-12-03 04:30:25

为什么Test1.hello() 运行不报错,而Test2.hello()报错

无法言说的痛 2021-12-01 04:38:19

和try有什么关系。

报错提示看不懂么.

Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream

jar里面没有这个类。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文