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

java.lang.ArrayStoreException:将类型不正确的值赋给Object[]array[duplicate]时

陈晟睿
2023-03-14

我有C背景。不能将对象添加到foo()中的对象[]中,这对我来说是没有意义的。

我希望函数foo中的代码在运行时工作,但在main()中当我尝试执行Strings[0].ToLowerCase()时失败,因为Strings[0]中的对象不是String而是一个没有ToLowerCase()StringBuilder。最终,我将一个指针存储到指针数组中,而行objects[0]=other不应无效。很明显,我对java的理解是错误的(但我现在还是个新手)。

class Main {

    static void foo(Object[] objects, Object other) {
        objects[0] = other;
    }
    public static void main(String[] args) {
        String[] strings = { "stringValue" };
        foo(strings, new StringBuilder());
    }
}

编辑:谢谢所有人的回答。多亏了@Andy Turner,我在谷歌上搜索了“Java协方差数组”,发现了这篇讨论这种行为的文章。诀窍在于编译器和运行库对代码的处理非常不同。编译器可以处理代码,而运行时不行。


共有1个答案

阎佑运
2023-03-14

ArrayStoreException的文档中可以看到:

引发以指示已尝试将错误类型的对象存储到对象数组中。例如,以下代码生成ArrayStoreException:

Object x[] = new String[3];
x[0] = new Integer(0);

仅仅因为您将String[]传递到需要Object[]方法中,并不意味着它实际上是Object[]。因为您创建了String[],所以只能向其中添加String的实例,而您正在尝试添加StringBuilder,这没有意义。

请注意,如果将String[]的类型更改为Object[]则不会引发异常:

public static void main(String[] args) {
    Object[] strings = { "stringValue" };
    foo(strings, new StringBuilder()); // Perfectly fine
}
 类似资料:
  • 我是angular的新手,我在学习这个hero教程时,偶然发现了这个错误: 我在这里复制了错误。

  • 我想把列表中的对象分配给类变量。 感恩节:)

  • 这个要怎么改 const callRowCol = (type: string, data: object) => { mapType.value = type; isVisible.value = true; console.log(type); console.log(data); };

  • 在我新创建的Angular应用程序中,我尝试使用mattlewis92的Angular日历来创建他的日历。我已经复制了他的github:https://mattlewis92.github.io/Angulat-calendar/#/kitchenter-sink上列出的所有步骤和代码,但我在第一行总是发现一个错误,即指出“{static:boolean;}类型的参数不能分配给{read?:any

  • 我和dplyr一起工作,我有一个类似的小消息: 所以我可以对每个列使用ifelse函数和mutate: 但是在我真正的df中,我有很多列,那么这个wat是非常低效的。我需要一些更优雅的东西,使用mutate_at和列名,但这似乎很难。我试着用很多方法做到这一点,但每次我都会出错。有什么建议吗?

  • 我是打字新手。我正在使用Express、Node和Typescript进行备份。我有一个具有类型的对象: 我正在创建一个新的水果实例,从JSON文件中重新创建水果类型并填充它 这会产生一个错误。我知道我得到这个错误是因为我分配了一个未知字符串而不是Enum值。我假设解决方案是在将水果类型指定给FruitType对象之前,以某种方式检查水果类型是否为其中一个值。如何修复此错误?