我收到一个错误:不能抛出 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

提问人:alyssad5 提问时间:3/4/2022 最后编辑:CRicealyssad5 更新时间:3/4/2022 访问量:401

问:

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.");
        }

        
    } 
        
}
Java 异常 ArrayIndexOutofBoundsException

评论

3赞 David 3/4/2022
您正在创建一个名为 .这不是异常类型,它只是类的名称。你希望将你的自定义类作为异常抛出什么?ArrayIndexOutOfBoundsException

答:

0赞 AndrewR 3/4/2022 #1

当代码被编译为字节码时,编译器必须发现所有类并将所有名称扩展到其 FQDN 中 - 包 + 类名

在您的例子中,当编译程序时,主类名称是 ArrayIndexOutOfBoundsException - 因此编译器将 ArrayIndexOutOfBoundsException 映射到您自己的类。

当编译器获取 catch line 时,它会接受 ArrayIndexOutOfBoundsException 并尝试首先在映射中找到它 - 它就在那里。因此,编译器开始检查正确性,特别是该类必须位于 Throwable 层次结构中。由于它不在可抛出的层次结构中(您的类隐式扩展了 Object),因此编译器将返回错误。

您可以使用两种方法修复它:

  1. 重命名主类以避免歧义
  2. 在 catch 中,您可以指定类的全名:java.lang.ArrayIndexOutOfBoundsException

第二个选项有助于解决一个通用问题:如果两个类具有相同的名称,但必须在同一作用域中使用,该怎么办?

0赞 Ernesto López 3/4/2022 #2

ArrayIndexOutOfBoundsException 异常类型包含在 java/lang 包中。因此,您必须导入它或在 catch 子句中使用全名:

catch (java.lang.ArrayIndexOutOfBoundsException ex)

在你的情况下,import 将不起作用,因为你的类也被称为 ArrayIndexOutOfBoundsException,所以你需要在 catch 子句中使用全名。

作为最后的建议,我建议你把你的类重命名为一个好的实践,因为它现在是这样,它可能会导致混淆并使代码难以阅读。