当前位置: 首页 > 面试题库 >

在编译时捕获ArrayStoreException

鲍钊
2023-03-14
问题内容

考虑下面的Java
ArrayList#toArray方法测试。请注意,我从这个有用的答案中借用了代码。

public class GenericTest {
    public static void main(String [] args) {
        ArrayList<Integer> foo = new ArrayList<Integer>();
        foo.add(1);
        foo.add(2);
        foo.add(3);
        foo.add(4);
        foo.add(5);
        Integer[] bar = foo.toArray(new Integer[10]);
        System.out.println("bar.length: " + bar.length);

        for(Integer b : bar) { System.out.println(b); }

        String[] baz = foo.toArray(new String[10]);       // ArrayStoreException
        System.out.println("baz.length: " + baz.length);
    }
}

但是,请注意,会有一个ArrayStoreException试图把一个时Integer进入String[]

输出:

$>javac GenericTest.java && java -cp . GenericTest
bar.length: 10
1
2
3
4
5
null
null
null
null
null
Exception in thread "main" java.lang.ArrayStoreException
        at java.lang.System.arraycopy(Native Method)
        at java.util.ArrayList.toArray(Unknown Source)
        at GenericTest.main(GenericTest.java:16)

可以通过Java泛型在编译时防止此错误吗?


问题答案:

ArrayStoreException
之所以存在,恰恰是因为Java的类型系统无法正确处理这种情况(IIRC,在泛型出现之前,以与集合框架相同的方式改造数组为时已晚)。

因此,通常无法在编译时防止此问题。

当然,您可以创建内部API来包装此类操作,以减少意外错误输入类型的可能性。



 类似资料:
  • 我得到以下编译错误: 当我编译(在Eclipse Juno中使用JDK 1.7.0)以下代码时: null 这样我就可以测试我所有的排序实现并测试它们。我想将结果与Java的排序实现进行比较,所以我也在编写这个接口的实现,它在内部只调用Java的排序方法。这就是我面对问题的地方。

  • 我知道这听起来像是一个奇怪的“问题”,但请坚持住。 我有一个支持OpenGL 3.3的显卡。< br >但是,我正在编写针对OpenGL 2.0的代码,因此也是针对1.1版的代码。< br >我有以下GLSL代码:< br > 如您所见,我已将GLSL版本指定为#version 110。 您可能还注意到,我对vec4位置使用了“in”关键字 该关键字在指定的GLSL版本中不可用,但它在我的图形卡(

  • 我试图用C(11/14)实现fortran的重塑功能,并设计了一个函数。此函数接受两个std::initializer\u列表。第一个initializer\u列表给出了我用来初始化多维数组的初始值。第二个initializer\u列表给出了数组每个维度的大小。我写了一份这样的草稿 这个实现需要给定的非类型模板参数int D,但我想要不带D的东西,比如重塑({1,2,3,4,5,6},{2,3})

  • 问题内容: 是否有可能为本地运行的Java应用程序和作为applet和/或JNLP Webapps可靠地确定给定类的编译时间戳? 问题答案: 根据Java虚拟机规范,类文件格式不需要任何类型的时间戳,因此,您最好的办法是检查包含该类的类或Jar文件的修改时间。不幸的是,文件系统操作(尤其是在各种主机之间)可能无法保留此类时间戳。 我会说默认情况下没有可靠的方法。但是,您可以在构建过程中轻松地将这样

  • 问题内容: 在什么情况下应该抓住一个应用程序? 问题答案: 通常,永远不会。但是,有时您需要捕获特定的错误。 如果您正在编写类似于框架的代码(正在加载第3方类),则捕获LinkageErrors(找不到类定义,不满意的链接,不兼容的类更改)可能是明智的。我还看到了一些愚蠢的第三方代码抛出错误的子类,因此您要么必须处理这些。 顺便说一下,我不确定不可能从OutOfMemory中恢复。

  • 问题内容: 在关于反射的本教程中,它指出: […]因为泛型是通过类型擦除实现的,因此在编译过程中会删除有关泛型类型的所有信息 我的知识是使用泛型,以便在编译时编译器可以检查类型安全性。即失败快速方法。但是该链接提到类型擦除会在编译期间删除通用信息。 问题答案: 您引用的语句是正确的:编译器在编译过程中在内部使用通用类型信息,在处理源时会生成与类型相关的错误。然后,一旦完成验证,编译器将生成类型擦除