我认为以下Java代码会引起RuntimeError(从技术上来讲),因为它引用了不存在的内容(类似于访问大小为5的数组中的第8个元素)。
int i;
System.out.println(i);
但是,IDE会捕获它,并在红色下划线。这会使它成为语法/编译器错误吗?还是IDE足够聪明就可以捕获的运行时错误?
实际上,这是编译器错误,但从技术上来讲不是语法错误吗?我一直认为它们是同义词,但是语法错误可能只是一种编译器错误...
我知道这只是语义,但是我正在教一门课,并且感到愚蠢,不知道它在技术上是什么类型的错误。
答案 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会指出这一点,但是如果您运行它,将会收到一些错误,例如我需要初始化