当前位置: 首页 > 知识库问答 >
问题:

为什么ArrayStoreException是RuntimeException?

孔阳平
2023-03-14

假设我们有以下程序:

class Fruit {}

class Apple extends Fruit {} 

class Jonathan extends Apple {} 

class Orange extends Fruit {} 

public class Main { 
    public static void main(String[] args) { 
        Fruit[] fruit = new Apple[10];

        try { 
            fruit[0] = new Fruit(); // ArrayStoreException 
            fruit[0] = new Orange(); // ArrayStoreException 
        } catch(Exception e) { System.out.println(e); } 
    } 
}

基于Java文档:

>

  • 为什么ArrayStoreException只在运行时抛出?

    编译器缺少哪些信息来意识到该赋值是不可能的?

  • 共有1个答案

    子车峰
    2023-03-14

    创建数组时,它会记住要存储的数据类型。

    数组只“记住”它在运行时实际包含的类型。

    首先声明数组,在本例中为fruit数组。

    然后创建数组,在本例中是apple的数组。

    创建是在运行时进行的,但编译器的设计只是为了验证数组是否只被分配了它声明为的类型的对象。在运行时会发生很多事情。

    请考虑以下代码:

    class Fruit {}
    
    class Apple extends Fruit {} 
    
    class Jonathan extends Apple {} 
    
    class Orange extends Fruit {} 
    
    public class Main { 
        public static void main(String[] args) { 
            Fruit[] fruit = new Apple[10];
            boolean alt = (Math.random() < 0.5);
    
            try { 
                fruit[0] = fruitFactory(alt); 
            } catch(Exception e) { System.out.println(e); } 
        } 
    
        private static Fruit fruitFactory(boolean apple) {
            if (apple) {
                return new Apple();
            } else {
                return new Orange();
            }
        } 
    }
    

    是的,在上面代码中的50%的情况下。您必须验证分配的对象是否与数组相同,或者捕获异常。

     类似资料:
    • 根据此MIPS指令参考,有两条指令(

    • Blade是无意间起的一个名字,始于 2015 年 9 月,目的为个人开发者提供一个除 Spring 系列框架的一个选择。 学习 Blade 搭建 Web 程序,只需要 1 小时,如果你是一个Web开发的老手,也许20分钟就够了。 Blade 是什么? 一个高效的 MVC 开发框架 是一个自带WebServer的库 帮助开发者快速构建Web程序 源代码不到 500KB 的开源框架 简洁优雅的 AP

    • Bootstrapping(引导) 是 Netty 中配置程序的过程,当你需要连接客户端或服务器绑定指定端口时需要使用 Bootstrapping。 如前面所述,Bootstrapping 有两种类型,一种是用于客户端的Bootstrap,一种是用于服务端的ServerBootstrap。不管程序使用哪种协议,无论是创建一个客户端还是服务器都需要使用“引导”。 面向连接 vs. 无连接 请记住,这

    • 问题内容: 什么是反射,为什么有用? 我对Java特别感兴趣,但是我认为原理在任何语言中都是相同的。 问题答案: 名称反射用于描述能够检查同一系统(或本身)中的其他代码的代码。 例如,假设您在Java中有一个未知类型的对象,并且想在该对象上调用“ doSomething”方法(如果存在)。除非对象符合已知的接口,否则Java的静态类型化系统并不是真正为支持该类型而设计的,但是使用反射,您的代码可以

    • 问题内容: 我了解JSON,但不了解JSONP。Wikipedia上有关JSON的文档是JSONP的最高搜索结果。它说: JSONP或“带填充的JSON”是JSON扩展,其中将前缀指定为调用本身的输入参数。 ??什么电话 这对我来说毫无意义。JSON是一种数据格式。没有电话 在第二个搜索结果是由某些人叫雷米,谁写的这个约JSONP: JSONP是脚本标记注入,它将响应从服务器传递到用户指定的函数。

    • 问题内容: 我经常在PHP中看到包含include.inc文件的示例。.inc是什么意思?它的作用是什么?使用它的缺点和优点是什么? 问题答案: 它没有任何意义,只是一个文件扩展名。如果扩展名是.inc的文件被设计为包含在其他PHP文件中,这是某些人的惯例,但这只是惯例。 它确实存在一个可能的缺点,即通常没有将服务器配置为将.inc文件解析为php,因此,如果该文件位于您的Web根目录中,并且您的