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

韭菜根 发布于 2016/08/04 20:55
阅读 550
收藏 0
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.
加载中
0
tinshen
tinshen

和try有什么关系。

报错提示看不懂么.

Exception in thread "main" java.lang.NoClassDefFoundError: javax/servlet/ServletOutputStream
jar里面没有这个类。

韭菜根
韭菜根
为什么Test1.hello() 运行不报错,而Test2.hello()报错
0
天天天
天天天
你修改成
throws Exception

试试看

你修改成
throws Exception

试试看

0
漓江
漓江

一点建议。
你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

返回顶部
顶部