【问题标题】:Why does the catch block produce a compiler error?为什么 catch 块会产生编译器错误?
【发布时间】:2015-11-26 05:40:54
【问题描述】:

我有以下人为的代码:

class Exception
{
    public static void main(String args[])
    {

        int x = 10;
        int y = 0;

        int result;

        try{
            result = x / y;
        }
        catch(ArithmeticException e){
            System.out.println("Throwing the exception");
            throw new ArithmeticException();
        }
        catch(Exception ae){
            System.out.println("Caught the rethrown exception");
        }
    }
}

第一个 catch 块重新抛出捕获的异常。然而,编译器说需要“不兼容的类型”和“可抛出的”。为什么会产生这个错误?

【问题讨论】:

  • catch(Exception ae) 中,它将Exception 识别为您自己的类。
  • 重命名类,让它与众不同。比异常

标签: java exception try-catch


【解决方案1】:

只需将您的班级名称从Exception to Exception1.更改为

看起来像是名称冲突的问题。

您的命名约定策略是反对 Java 标识符定义规则。

意思是,你不能给出图书馆已经给出的名字。这里是类名。

【讨论】:

  • 如果我将类命名为 'Exception' 并且 java.lang 中已经有一个类 'Exception',为什么代码会编译?
  • 是的,我正在使用 eclipse
  • 尝试关闭您的课程,重新打开并运行它。
  • 编译,我已经在 Windows 中尝试过,也可以通过命令行进行编译。
  • kevin,编译器刚刚检查,有没有与保留关键字匹配的标识符?如果找到然后错误来了。在这里,场景是类名与其他类名匹配,而不是我们使用的关键字。对吗?
【解决方案2】:

您的 Exception 类隐藏了 java.lang.Exception 并且您正试图将自己的类作为异常抛出。您应该抛出一个扩展 java.lang.Exception 类的对象。

只需用 java.lang.Exception 更改 Exception

catch(java.lang.Exception ae)

或者更改隐藏java.lang.Exception的班级名称

【讨论】:

    【解决方案3】:

    试试这个

    将您的类名从 Exception 更改为另一个用户定义的名称。

    这是名称冲突的问题,因为 Exception 是内置的

    java 中的类,因此您不能在源代码中给出相同的名称。

    就像你不能在java中使用关键字作为标识符一样。 Exception 不是关键字,但它已经用作类标识符。

    【讨论】:

      【解决方案4】:

      当一个函数可以抛出异常时,你需要在函数头中声明。

      https://docs.oracle.com/javase/tutorial/essential/exceptions/declaring.html

      【讨论】:

      • 这仅适用于检查的异常,您的引文是这样说的。这个方法抛出的唯一异常是ArithmeticException,这是一个RuntimeException,它不是一个检查异常。注意 Java 教程不是规范性参考。
      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 2012-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多