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

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

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


当前回答

我也得到了这个错误。(我在谷歌上搜索了一下,然后转到了这个页面)

问题:我正在从另一个项目B中定义的类调用项目a的类中定义的静态方法。 我得到以下错误:

error: cannot find symbol

解决方案:我通过首先构建定义方法的项目,然后构建调用方法的项目来解决这个问题。

其他回答

正如人们上面提到的,可能有各种各样的情况。有几件事帮助我解决了这个问题。

如果您正在使用IntelliJ 文件->“无效缓存/重新启动”

OR

被引用的类在另一个项目中,并且该依赖项没有添加到我的项目的Gradle构建文件中。所以我添加了依赖使用 编译项目(“:anotherProject”)

这招奏效了。HTH !

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

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

考虑下面的代码:

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);

如果你忘记了new,你也会得到这个错误:

String s = String();

String s = new String();

因为不带new关键字的调用将尝试寻找一个名为String而不带参数的(本地)方法——而且该方法签名可能没有定义。

在我的情况下,我必须执行以下操作:

将context.xml文件从src/java/package移动到资源目录(IntelliJ .xml) IDE) 清理目标目录。

回复:4.4:Stephen C的优秀回答中的一个早期构建问题:

我在开发osgi应用程序时遇到过这种情况。 我有一个java项目a,它依赖于B。 在建造B时,出现了错误:

Compilation failure: org.company.projectA.bar.xyz does not exist

但是在eclipse中,根本不存在编译问题。

调查 当我在A.jar中查看时,有org.company.projectA.foo.abc的类,但没有org.company.projectA.bar.xyz的类。

缺少类的原因是,在A/pom.xml中,有一个导出相关包的条目。

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    ...
    <configuration>
        <instructions>
            ....
            <Export-Package>org.company.projectA.foo.*</Export-Package>
        </instructions>
    </configuration>
</plugin>

解决方案 像这样添加缺少的包:

<Export-Package>org.company.projectA.foo.*,org.company.projectA.bar.*</Export-Package>

重建一切。

现在,A.jar包含了所有预期的类,所有的东西都编译好了。