【问题标题】:What type of error occurs when using an uninitialized variable?使用未初始化的变量时会发生什么类型的错误?
【发布时间】:2019-03-10 14:42:47
【问题描述】:

我认为以下 Java 代码会导致 RuntimeError(从技术上讲),因为它引用了不存在的东西(很像访问大小为 5 的数组中的第 8 个元素)。

int i;
System.out.println(i);

但是,IDE 会捕捉到它,并用红色下划线。这是否使它成为语法/编译器错误?还是 IDE 足够聪明地捕捉到的运行时错误?

实际上,这是编译器错误,但在技术上不是语法错误?我一直认为它们是同义词,但也许语法错误只是编译器错误的一种......

我知道这只是语义,但我正在教一门课,不知道从技术上讲是什么类型的错误,感觉很傻。

【问题讨论】:

    标签: java compiler-errors runtime-error


    【解决方案1】:

    如果int i;是声明一个局部变量,在赋值之前使用它是编译错误;请参阅@Eran 对 JLS 相关部分的回答。

    编译错误和编译时错误是同义词。 (编译器错误是另一个同义词,尽管有时人们用它来指代编译器中的错误。)

    这是否会导致语法/编译器错误?

    这是一个编译错误。但这不是语法错误。

    这种类型的编译错误通常称为语义错误

    语法错误意味着代码不符合语言的指定语法(由语法定义)。也就是说,解析器无法解析。

    语义错误是任何非语法错误的编译错误。根据编程语言,语义错误可能包括:

    • 编译时类型错误
    • 编译器无法解析的符号
    • 上下文类型错误的符号
    • 无法访问的代码
    • 使用未初始化的变量
    • 等等。

    还是 IDE 足够聪明地捕捉到的运行时错误?

    这不是运行时错误。

    实际上,这是编译器错误,但在技术上不是语法错误?

    正确。

    我一直认为它们是同义词,但也许语法错误只是编译器错误的一种......

    它们不是同义词。语法错误只是一种编译错误。

    (不幸的是,一些 Javascript 实现混淆地将所有编译错误称为“语法错误”。但如果您正在教 Java,这无关紧要。Java 不是 Javascript。)

    【讨论】:

      【解决方案2】:

      这是 JLS 指定的编译时错误:

      14.4.2. Execution of Local Variable Declarations

      局部变量声明语句是可执行语句。每次执行时,声明符从左到右依次进行处理。如果声明器具有初始化表达式,则计算表达式并将其值分配给变量。

      如果声明符没有初始化表达式,则每次引用变量之前都必须执行对变量的赋值,否则会发生编译时错误 16.

      【讨论】:

        【解决方案3】:

        您是否尝试过在不使用 IDE 的情况下编译它?
        在 Java 中,它被检测为编译时错误:error: variable i might not have been initialized

        【讨论】:

          【解决方案4】:

          这是简单的运行时错误。 IDE 会指出这一点,但是如果你运行它,你会得到一些错误,比如我需要初始化

          【讨论】:

          • 这不是运行时错误。该错误在编译时引发。
          猜你喜欢
          • 2016-12-28
          • 1970-01-01
          • 2022-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-02
          • 1970-01-01
          • 2020-12-05
          相关资源
          最近更新 更多