小编mmo*_*son的帖子

JSP编译器的负时间

可能导致这样的错误的原因是什么?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的来源.

jsp tomcat tomcat7

8
推荐指数
2
解决办法
5124
查看次数

java Map可以返回大小-1吗?

我有一些代码创建一个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:

当迭代它时,用户必须手动同步返回的集合:

Set s = Collections.synchronizedSet(new HashSet());
      ...
synchronized(s) {
    Iterator i = s.iterator(); // Must be in the synchronized block
    while (i.hasNext())
        foo(i.next());
}
Run Code Online (Sandbox Code Playgroud)

不遵循此建议可能会导致非确定性行为.

对我来说,非确定性行为可能包括-1的大小.我需要返回并确保在迭代集合时正确同步,但我怀疑这是问题所在.

java

5
推荐指数
2
解决办法
3374
查看次数

使用 0 值调用 setSoLinger 与根本不启用 soLinger 有什么区别?

在 Java 中,使用 Socket.setSoLinger(true, 0) 设置套接字和根本不调用 setSoLinger 有区别吗?套接字的关闭方式有区别吗?

我已经查看了 Java 源代码,我没有看到关于 soLinger 的套接字关闭有什么特别之处。这让我相信这是操作系统特定的行为。就我而言,我在 Linux 上工作。

java sockets

5
推荐指数
1
解决办法
8244
查看次数

标签 统计

java ×2

jsp ×1

sockets ×1

tomcat ×1

tomcat7 ×1