报错记录:Caused by: java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 19

报错详情:

这个错误通常表示你在尝试访问数组时使用了一个超出数组范围的索引。在这个特定的情况下,可能是在解析日期时间字符串时发生了问题。

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)。

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值