可能导致这样的错误的原因是什么?File.java的Javadoc表示,如果以负值传递,它将抛出此异常.所以问题是,为什么碧玉传递负值.我找了jasper的来源,但是我找不到与我正在运行的完全相符的那些,行号不完全匹配.根据javadoc,我已经从File.lastModified设置了最后修改时间,该时间永远不会返回负值.
SEVERE: Servlet.service() for servlet jsp threw exception
java.lang.IllegalArgumentException: Negative time
at java.io.File.setLastModified(File.java:1258)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:376)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
Run Code Online (Sandbox Code Playgroud)
...
更新:我下载了Tomcat的源代码并阅读了源代码.Compile.java的相关代码是:
375 File javaFile = new File(ctxt.getServletJavaFileName());
376 Long jspLastModified = ctxt.getLastModified(ctxt.getJspFile());
377 javaFile.setLastModified(jspLastModified.longValue());
Run Code Online (Sandbox Code Playgroud)
ctxt是一个JspCompilationContext,如果有任何错误,它会默认返回-1,而File会从负参数中抛出IllegalArgumentException.我仍然不知道为什么我会收到错误,至少我知道IllegalArgumentException的来源.
我有一些代码创建一个List,用Map的大小初始化:
private Set<String> mKeys = new HashSet<String>(64);
....
List<String> keyList = new ArrayList<String>(mKeys.size());
Run Code Online (Sandbox Code Playgroud)
我看到一个异常:java.lang.IllegalArgumentException:非法容量:-1
Map可以返回-1的大小吗?我正在查看HashSet的源代码,它由HashMap支持.HashMap的源代码显示了内部,其中elementCount总是在removeEntry()调用上递减.此外,HashMap.empty()的方法对elementCount的回复为== 0,如果elementCount为-1,则返回false.
有没有人遇到过这个?我可以围绕它进行编码,但这感觉就像一个黑客,这让我觉得我对当前的代码做错了.
编辑:我原本试图简化问题.我正在使用的Set实际上被定义为
private static Set<String> mKeys = Collections.synchronizedSet(new HashSet<String>(64));
Run Code Online (Sandbox Code Playgroud)
编辑:这里的关键可能在synchronizedSet中.来自JavaDoc:
当迭代它时,用户必须手动同步返回的集合:
Run Code Online (Sandbox Code Playgroud)Set s = Collections.synchronizedSet(new HashSet()); ... synchronized(s) { Iterator i = s.iterator(); // Must be in the synchronized block while (i.hasNext()) foo(i.next()); }不遵循此建议可能会导致非确定性行为.
对我来说,非确定性行为可能包括-1的大小.我需要返回并确保在迭代集合时正确同步,但我怀疑这是问题所在.
在 Java 中,使用 Socket.setSoLinger(true, 0) 设置套接字和根本不调用 setSoLinger 有区别吗?套接字的关闭方式有区别吗?
我已经查看了 Java 源代码,我没有看到关于 soLinger 的套接字关闭有什么特别之处。这让我相信这是操作系统特定的行为。就我而言,我在 Linux 上工作。