首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中的运行时执行过程是什么? JVM如何在运行时检查数组类型?

java中的运行时执行过程是什么? JVM如何在运行时检查数组类型?
EN

Stack Overflow用户
提问于 2020-09-09 07:09:31
回答 1查看 190关注 0票数 0

我读过关于泛型和类型安全性的文章,发现数组在java中不可能是通用的。我还理解了数组的协变性质,它将我引向数组存储异常。我明白为什么会出现这种异常。

我尝试了下面的代码

代码语言:javascript
复制
class SuperClass {
    
}

class SubClass extends SuperClass {
    
}
public class ArrayCheck {
    
    public static void main (String args[]) {   
        SubClass arr[] = new SubClass[10];
        
        arr[0] = new SubClass();
        
        SuperClass[] arr1 = arr;
        arr1[1] = new SuperClass();
        
    }
}

这就像预期的那样提供了一个ArrayStoreException。我的问题是

  1. 我的问题是JVM如何在运行时检查数组类型?编译器是否追加任何额外的代码,或者在执行指令之前是否有JVM遵循的预定义进程?

  1. 在什么时候提出了这个异常?我以为只有当我试图读取数组时,ArrayStoreException才会出现,但我错了。因此,我不知道在什么时候出现了这个错误。

另外,还需要对Java程序执行过程做一点澄清。

  1. 是运行时错误和异常,只有在程序执行过程中发生的错误,即JVM已经开始解释和执行指令,或者字节码验证期间的错误也被认为是运行时错误。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-09 08:22:16

我的问题是JVM如何在运行时检查数组类型?

当JVM解释字节码时,解释器在解释aastore字节码指令时执行相关的运行时类型检查。相关的JVM规范链接是https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.aastore

JIT编译器将将aastore指令转换为执行相同任务的本机代码,尽管它可以优化可以确定为冗余的任何类型检查。

注意,只有当您调整字节码以尝试将引用分配给原始类型的数组时,这种事情才会引起验证者的注意。

在什么时候引发了这个异常?

将值赋值到某个引用类型的数组时,所分配的值与数组的基本类型不兼容。

(请注意,对于基元类型数组,异常不会抛出。如果尝试将long分配给int[],或者将boolean分配给int[],则会得到编译错误。如果您试图将一个int赋值给一个long[],那么它的值将被拓宽。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63806449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档