报错详情:
这个错误通常表示你在尝试访问数组时使用了一个超出数组范围的索引。在这个特定的情况下,可能是在解析日期时间字符串时发生了问题。
Caused by: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 19
at java.base/java.text.DigitList.fitsIntoLong(DigitList.java:230)
at java.base/java.text.DecimalFormat.parse(DecimalFormat.java:2119)
at java.base/java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1931)
at java.base/java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1541)
at java.base/java.text.DateFormat.parse(DateFormat.java:393)
at com.ruoyi.web.controller.dicom.StudyController.lambda$getSeriesOfStudy$2(StudyController.java:129)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:952)
at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:926)
at java.base/java.util.stream.AbstractTask.compute(AbstractTask.java:327)
at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
经分析源代码,发现在多线程环境下操作了共享的SimpleDateFormat
对象,从而导致解析出现问题。
在多线程环境下操作共享的SimpleDateFormat对象可能导致ArrayIndexOutOfBoundsException
异常。这是因为SimpleDateFormat内部使用了一个数组来存储日期格式化模式的解析结果,而该数组的访问是非线程安全的。
在SimpleDateFormat的源码中,有一个名为compiledPattern
的私有成员变量,它是一个char数组,用于存储日期格式化模式的解析结果。在解析模式字符串时,SimpleDateFormat会将解析结果存储在compiledPattern
数组中,以便在格式化和解析日期时使用。
然而,由于compiledPattern
数组是共享的,多个线程同时对其进行访问和修改时,可能会导致竞态条件。例如,一个线程正在修改compiledPattern
数组的内容,而另一个线程同时访问该数组,可能会导致数组越界访问,从而抛出ArrayIndexOutOfBoundsException
异常。
则考虑使用线程安全的日期时间解析工具(如DateTimeFormatter
)。