Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 分析日期字符串时引发多个异常_Java_Tomcat_Simpledateformat - Fatal编程技术网

Java 分析日期字符串时引发多个异常

Java 分析日期字符串时引发多个异常,java,tomcat,simpledateformat,Java,Tomcat,Simpledateformat,我试图在对象的构造函数中将字符串解析为日期,我们称之为Example。这是密码 private static final SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); private long time; public Example(String date) { try { this.time = sdf.parse(date).getTime();

我试图在对象的构造函数中将字符串解析为日期,我们称之为
Example
。这是密码

private static final SimpleDateFormat sdf = new SimpleDateFormat(
        "yyyy-MM-dd HH:mm:ss");

private long time;

public Example(String date) {
    try {
        this.time = sdf.parse(date).getTime();
    } catch (Exception e) {
        logger.log(Level.WARNING, "Exception while parsing date " + date, e);
    }
}
现在,我在一个Tomcat实例中创建这些对象(不管这是否有任何区别)

我得到以下类型的异常

Fri Jul 06 15:13:48 EDT 2012 WARNING: Exception while parsing date 2012-07-06 18:57:31
java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
    at java.lang.Long.parseLong(Long.java:431)
    at java.lang.Long.parseLong(Long.java:468)
    at java.text.DigitList.getLong(DigitList.java:177)
    at java.text.DecimalFormat.parse(DecimalFormat.java:1297)
    at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1589)
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1311)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at ...
Fri Jul 06 15:13:48 EDT 2012 WARNING: Exception while parsing date 2012-07-06 19:00:07
java.lang.NumberFormatException: multiple points
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1082)
    at java.lang.Double.parseDouble(Double.java:510)
    at java.text.DigitList.getDouble(DigitList.java:151)
    at java.text.DecimalFormat.parse(DecimalFormat.java:1302)
    at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1934)
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1311)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at ...
Fri Jul 06 15:13:48 EDT 2012 WARNING: Exception while parsing date 2012-07-06 19:13:21
java.lang.ArrayIndexOutOfBoundsException: -1
    at java.text.DigitList.fitsIntoLong(DigitList.java:212)
    at java.text.DecimalFormat.parse(DecimalFormat.java:1295)
    at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1934)
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1311)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at ...
Fri Jul 06 15:48:06 EDT 2012 WARNING: Exception while parsing last check string 2012-07-06 19:08:08
java.lang.NumberFormatException: For input string: ".200172E4.200172"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1222)
    at java.lang.Double.parseDouble(Double.java:510)
    at java.text.DigitList.getDouble(DigitList.java:151)
    at java.text.DecimalFormat.parse(DecimalFormat.java:1302)
    at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1589)
    at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1311)
    at java.text.DateFormat.parse(DateFormat.java:335)
    at ...
所以它在日期上失败了

2012-07-06 18:57:31
2012-07-06 19:00:07
2012-07-06 19:13:21
2012-07-06 19:08:08
但是,如果我进行单元测试,我会从这些字符串中获得
time
的以下值

1341615451000
1341615607000
1341616401000
1341616088000
因此,
SimpleDataFormat
对象确实可以工作。。。但不是在服务器上?我注意到这个问题发生在服务器启动时,如果有帮助的话,以后不会发生。我不确定下一步该怎么办


使用Tomcat 7.0和Java 1.6更新32。

SimpleDataFormat不是线程安全的:请参阅Javadoc。

SimpleDataFormat不是线程安全的,如前所述 有时,使用“静态”对象时真正奇怪或非逻辑的行为来自并发问题


要解决这种情况,请每次使用一个新实例(这比同步要好,因为同步可能会引发瓶颈问题)

对于Java 8+,最好使用基于
Java.time
的解决方案

java.time
中的类是线程安全的

您可以实现如下等效日期提取:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

...

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

LocalDateTime date = LocalDateTime.parse(str, dockerDateFormatter);
然后从
date
查询所需字段

有关和的更多详细信息,请参阅JavaDoc


另一个有两个现成的示例。

我怀疑您在部署时正在将空字符串传递到示例构造函数中。@hvgotcodes我不认为这是可能的,因为我正在记录传递到构造函数中的字符串,正如您在日志中看到的那样。这可能是并发问题吗?SimpleDataFormat似乎不是线程安全的@cporte哇,就是这样!我同步访问了
sdf
对象,它似乎工作正常。留下一个答案,我会接受它不同步,但每次都在本地创建一个新的SimpleDataFormat。这就避免了人为的瓶颈,这需要付出一点对象开销。我在提交给集群的Apache Spark作业中遇到了完全相同的错误——我最难弄清楚问题出在哪里,因为完全相同的作业可以在完全相同的数据上在本地正常运行。原来是同一个问题!我在所有线程中都使用了相同的SimpleDataFormat。链接已断开,但为什么要引用第三方而不是Javadoc是个谜。或者跳过格式化程序,只需将空格替换为“T”,以表示java中默认使用的标准ISO 8601格式。time:
LocalDateTime.parse(“2012-07-06 18:57:31”。replace(“,“T”)