项目运行时,有时候会遇到异常java.lang.ArrayStoreException,导致进程启动失败,但是从异常信息并不能直接看出来是什么原因。 问题表现 Spring Boot启动失败,错误异常栈如下: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy 引入了对应的jar包后,问题解决 参考 深入Spring Boot:怎样排查 java.lang.ArrayStoreException
然而,数组操作中如果不注意类型的一致性,很容易引发java.lang.ArrayStoreException异常。 一、分析问题背景 java.lang.ArrayStoreException是一种运行时异常,当尝试将错误类型的对象存储到数组中时,就会抛出此异常。 虽然Number是一个父类,但String并不是Number的子类,因此会引发ArrayStoreException。 错误的强制转换:在数组元素存储过程中,错误地进行类型转换,也可能导致ArrayStoreException。 四、正确代码示例 为了避免ArrayStoreException,我们需要确保在向数组中存储对象时,类型是兼容的。
来源:Hengyunabc , hengyunabc.github.io/spring-boot-ArrayStoreException/ java.lang.ArrayStoreException 分析 这个demo来说明怎样排查一个spring boot 1应用升级到spring boot 2时可能出现的java.lang.ArrayStoreException。 MyHealthIndicatorAutoConfiguration上的确没有@Endpoint,但是为什么抛出java.lang.ArrayStoreException? 再仔细看异常信息:java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy ArrayStoreException 那么它是怎么变成ArrayStoreException的呢?
将某个项目从Spring Boot1升级Spring Boot2之后出现如下报错,查了很多不同的解决方法都没有解决: Spring boot2项目启动时遇到了异常: java.lang.ArrayStoreException : sun.reflect.annotation.TypeNotPresentExceptionProxy Caused by: java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy 应该是从class org.activiti.spring.boot.SecurityAutoConfiguration出错,然后报错java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy 而这里数组越界了,ArrayStoreException只有越界的Object的类型信息,也就是上面的。
web/config/WebAppConfigurer.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException : sun.reflect.annotation.TypeNotPresentExceptionProxy java.lang.ArrayStoreException 这个确实平时很少遇到,看了下源码 WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException : sun.reflect.annotation.TypeNotPresentExceptionProxy 所以说这些错误信息没能直接定位问题就是这个原因,我们要关注的还是 java.lang.ArrayStoreException
Father[] fatherArray = childArray; System.out.println(fatherArray.getClass()); // ArrayStoreException java.lang.ArrayStoreException 表明已经尝试作出了错误类型的对象存储到对象的数组。 例如,下面的代码生成一个ArrayStoreException ?
Value的值是Object型,要装到Object[]数组中,而不是String[]。
web/config/WebAppConfigurer.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException : sun.reflect.annotation.TypeNotPresentExceptionProxy java.lang.ArrayStoreException 这个确实平时很少遇到,看了下源码 WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.ArrayStoreException : sun.reflect.annotation.TypeNotPresentExceptionProxy 所以说这些错误信息没能直接定位问题就是这个原因,我们要关注的还是 java.lang.ArrayStoreException
RuntimeExecption在java.lang包下 下面是由java虚拟机提供的运行时异常 AnnotationTypeMismatchException, ArithmeticException, ArrayStoreException WebServiceException 5种常见异常: ClassCastException(类转换异常) IndexOutOfBoundsException(数组越界) NullPointerException(空指针) ArrayStoreException
BaseClass[] baseArray = subArray; System.out.println(baseArray.getClass()); // java.lang.ArrayStoreException 但是由于数组中元素类型都是SubClass类型的,所以 baseArray[0] = new BaseClass();会报错java.lang.ArrayStoreException。 list.toArray(); System.out.println(objArray.getClass()); objArray[0] = new Object(); // cause ArrayStoreException
BaseClass[] baseArray = subArray; System.out.println(baseArray.getClass()); // java.lang.ArrayStoreException list.toArray(); System.out.println(objArray.getClass()); objArray[0] = new Object(); // cause ArrayStoreException 但是由于数组中元素类型都是SubClass类型的,所以 baseArray[0] = new BaseClass();会报错java.lang.ArrayStoreException。
“ArrayStoreException” 当Java数组中转换元素的规则被破坏时,就会发生“ArrayStoreException”异常。对于放到数组中的内容一定要非常小心。 END ............... */ 可以产生以下输出: Exception in thread "main" java.lang.ArrayStoreException: java.lang.Doubleat 阅读此关于如何解决“ArrayStoreException”的讨论。(@StackOverflow) 29.
NullPointerException ArrayIndexOutOfBoundsException ClassCastException ArrayIndexOutOfBoundsException ArrayStoreException Deoptimization::Reason_class_check: if (java_bc() == Bytecodes::_aastore) { ex_obj = env()->ArrayStoreException_instance
test6也很有意思,虽然List<Brand>转化为了Brand[],编译通过,但是由于传入的Byd[]为brands1的运行时类型,在往实际的Byd[]中存放Brand的过程中,会报ArrayStoreException 数组对象的底层数据存储如上图所示,对象头中Mark Word存储hashCode和内存回收、并发相关信息,Klass Word为类型指针,存储类型不匹配抛出ArrayStoreException,array Brand[] brands1 = brands.toArray(new Byd[0]); // 编译通过, 但是运行时异常: // java.lang.ArrayStoreException (); list.add(1); Double[] list2 = list.toArray(new Double[0]); // java.lang.ArrayStoreException
ArithmeticException - 算术运算异常 ArrayStoreException - 向数组中存放与声明类型不兼容对象异常 IndexOutOfBoundsException - 下标越界异常
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException
NullPointerException ArrayIndexOutOfBoundsException ClassCastException ArrayIndexOutOfBoundsException ArrayStoreException
if (index >= 0 && index < arr.length) { int element = arr[index]; // 进一步处理 } 5.ArrayStoreException Object[] array = new String[5]; array[0] = 1; // 会抛出 ArrayStoreException 处理方法: //说明:当试图将错误类型的对象存储到对象数组中时抛出此异常 Object[] array = new String[5]; try { array[0] = 1; // 这个地方抛出 ArrayStoreException } catch (ArrayStoreException
ArrayStoreException 试图将错误类型的对象存储到一个对象数组时抛出的异常。 For example, the following code generates an ArrayStoreException: Object x[] = new String[3]; x[0]
即使通过向上转型(如 Object[] 接收 String[]),也不能存储其他类型元素,否则会抛出 ArrayStoreException:String[] strArr = {"a", "b"};Object [] objArr = strArr; // 允许向上转型objArr[0] = 123; // 编译通过,但运行时抛出 ArrayStoreException这种设计保证了类型安全,避免了隐式类型转换导致的错误