使用未初始化的变量时会发生什么类型的错误?

时间:2019-03-10 14:42:47

标签: java compiler-errors runtime-error

我认为以下Java代码会引起RuntimeError(从技术上来讲),因为它引用了不存在的内容(类似于访问大小为5的数组中的第8个元素)。

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

但是,IDE会捕获它,并在红色下划线。这会使它成为语法/编译器错误吗?还是IDE足够聪明就可以捕获的运行时错误?

实际上,这是编译器错误,但从技术上来讲不是语法错误吗?我一直认为它们是同义词,但是语法错误可能只是一种编译器错误...

我知道这只是语义,但是我正在教一门课,并且感到愚蠢,不知道它在技术上是什么类型的错误。

4 个答案:

答案 0 :(得分:3)

如果int i;声明了局部变量,则在将其分配给它之前使用它是编译错误;有关JLS相关部分,请参见@Eran的答案。

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

  

是否使它成为语法/编译器错误?

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

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

语法错误表示该代码不符合该语言的指定语法(由语法定义)。换句话说,解析器无法解析它。

语义错误是不是语法错误的任何编译错误。取决于编程语言,语义错误 可能包括以下内容:

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

还是IDE足够聪明可以捕获的运行时错误?

这不是运行时错误。

  

实际上是编译器错误,但从技术上来讲不是语法错误吗?

正确。

  

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

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

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

答案 1 :(得分:2)

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

  

14.4.2. Execution of Local Variable Declarations

     

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

     

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

答案 2 :(得分:0)

您是否尝试过不使用IDE进行编译?
在Java中,它被检测为编译时错误,提示:错误:变量i可能尚未初始化

答案 3 :(得分:-3)

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