提问人:alyssad5 提问时间:3/4/2022 最后编辑:CRicealyssad5 更新时间:3/4/2022 访问量:401
我收到一个错误:不能抛出 ArrayIndexOutOfBoundsException 类型的异常;异常类型必须是 Throwable 类的子类型
I am receiving an error: no exception of type ArrayIndexOutOfBoundsException can be thrown; an exception type must be a subtype of class Throwable
问:
import java.util.*;
public class ArrayIndexOutOfBoundsException {
public static void main(String[] args) {
int[] array = new int[100];
创建具有 100 个存储空间的阵列 for(int i = 0; i < array.length; i++) { //for 循环,用于在数组的每个索引中存储随机整数 数组[i] = (int) (数学随机()*100); }
Scanner input = new Scanner(System.in);
System.out.println("Enter the index of the array: ");
提示用户输入索引以查找
try {
int index = input.nextInt(); //declaring index variable to take on inputed value
System.out.println("The integer at index "+index+" is: "+array[index]); //printing the integer at the specified index
}
catch (ArrayIndexOutOfBoundsException ex) { //if user enters index value outside of 0-99, exception message will print
System.out.println("Out of bounds.");
}
}
}
答:
当代码被编译为字节码时,编译器必须发现所有类并将所有名称扩展到其 FQDN 中 - 包 + 类名
在您的例子中,当编译程序时,主类名称是 ArrayIndexOutOfBoundsException - 因此编译器将 ArrayIndexOutOfBoundsException 映射到您自己的类。
当编译器获取 catch line 时,它会接受 ArrayIndexOutOfBoundsException 并尝试首先在映射中找到它 - 它就在那里。因此,编译器开始检查正确性,特别是该类必须位于 Throwable 层次结构中。由于它不在可抛出的层次结构中(您的类隐式扩展了 Object),因此编译器将返回错误。
您可以使用两种方法修复它:
- 重命名主类以避免歧义
- 在 catch 中,您可以指定类的全名:java.lang.ArrayIndexOutOfBoundsException
第二个选项有助于解决一个通用问题:如果两个类具有相同的名称,但必须在同一作用域中使用,该怎么办?
ArrayIndexOutOfBoundsException 异常类型包含在 java/lang 包中。因此,您必须导入它或在 catch 子句中使用全名:
catch (java.lang.ArrayIndexOutOfBoundsException ex)
在你的情况下,import 将不起作用,因为你的类也被称为 ArrayIndexOutOfBoundsException,所以你需要在 catch 子句中使用全名。
作为最后的建议,我建议你把你的类重命名为一个好的实践,因为它现在是这样,它可能会导致混淆并使代码难以阅读。
评论
ArrayIndexOutOfBoundsException