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.
和try有什么关系。
报错提示看不懂么.
Exceptioninthread"main"java.lang.NoClassDefFoundError:javax/servlet/ServletOutputStream
throwsException
试试看
你修改成throwsException
试试看
一点建议。
你catch住的是一个Exception。而你抛出的是一个IOException,Exception是所有异常的父类。catch不住的才会抛出,但Exception的话,会catch住所有的异常。ThrowsIOException其实是走不到的。
正常的话应该是这样的:
publicvoidgetRequest(HttpServletResponseresp)throwsException{
。。。
if(os!=null){
try{
os.close();
}catch(IOExceptionioe){
//donothing.
}
}
}
os
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。