请解释以下关于“无法找到符号”,“无法解析符号”或“符号未找到”的错误(在Java中):

它们是什么意思? 什么东西会引起它们? 程序员如何着手修复它们?

本问题旨在针对Java中常见的编译错误进行全面的问答。


当前回答

我在误差以下

java: cannot find symbol
  symbol: class __

要解决这个问题

我尝试启用lambok,重新启动intellij等,但下面对我有用。

Intellij Preferences ->Compiler -> Shared Build process VM Options,设置为

  -Djps.track.ap.dependencies=false

比跑

mvn clean install

其他回答

我是这样解决这个错误的……疯狂的机器人。我有包的名称为适配器和我重构名称适配器与“a”而不是“a”,并解决了这个错误。

要获得提示,请仔细查看抛出错误的类名name和行号,例如: 编译失败 [ERROR] \applications\xxxxx.java:[44,30] ERROR:无法找到符号

另一个原因是java版本不支持的方法,例如jdk7 vs 8。 检查您的%JAVA_HOME%

“找不到”的意思是,编译器找不到合适的变量,方法,类等…如果你得到了错误提示,首先你要找到得到错误提示的代码行,然后你就可以在使用它之前找到哪个变量、方法或类没有定义。确认初始化该变量后,方法或类可以用于以后的需要…考虑下面的例子。

我将创建一个演示类并打印一个名称…

class demo{ 
      public static void main(String a[]){
             System.out.print(name);
      }
}

现在看看结果。

该错误说,“变量名找不到”..为name变量定义并初始化值可以消除该错误。

class demo{ 
      public static void main(String a[]){

             String name="smith";

             System.out.print(name);
      }
}

现在看看新的输出……

成功解决了这个错误..同时,如果你可以得到“找不到方法”或“找不到类”的东西,首先定义一个类或方法,然后使用它..

再举一个"变量超出范围"的例子

这类问题我已经见过几次了,也许是另一个例子,说明什么是非法的,即使它可能感觉不错。

考虑下面的代码:

if(somethingIsTrue()) {
  String message = "Everything is fine";
} else {
  String message = "We have an error";
}
System.out.println(message);

这是无效代码。因为命名为message的变量在它们各自的作用域之外都是不可见的——在本例中是周围的括号{}。

你可能会说:“但是一个名为message的变量是用两种方式定义的——所以message是在if之后定义的。”

但你错了。

Java没有free()或delete操作符,因此它必须依赖于跟踪变量作用域来发现变量何时不再使用(以及对这些原因变量的引用)。

如果你认为自己做了好事,那就更糟了。我在“优化”代码后就见过这样的错误:

if(somethingIsTrue()) {
  String message = "Everything is fine";
  System.out.println(message);
} else {
  String message = "We have an error";
  System.out.println(message);
}

“哦,这里有重复的代码,让我们把公共线拉出来”->,就是这样。

处理这种作用域问题最常见的方法是将else值预先分配给外部作用域的变量名,然后在if中重新分配:

String message = "We have an error";
if(somethingIsTrue()) {
  message = "Everything is fine";
} 
System.out.println(message);

解决了

使用IntelliJ

选择Build->Rebuild Project将解决这个问题