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

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

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


当前回答

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

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

error: cannot find symbol

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

其他回答

如果您在其他地方的构建中遇到此错误,而您的IDE表示一切正常,那么请检查您在两个地方使用的Java版本是否相同。

例如,Java 7和Java 8有不同的API,因此在较旧的Java版本中调用不存在的API会导致此错误。

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

String s = String();

String s = new String();

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

您使用maven compile编译代码,然后使用maven test运行它,结果很好。现在,如果你在代码中改变了一些东西,然后在没有编译的情况下运行它,你会得到这个错误。

解决方案:再次编译,然后运行测试。对我来说是这样的。

回复: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包含了所有预期的类,所有的东西都编译好了。

Optional.isEmpty ()

我很高兴在我的IDE中使用!Optional.isEmpty(),它工作得很好,因为我正在用>= JDK11编译/运行我的项目。现在,当我在命令行上使用Gradle(在JDK8上运行)时,我在编译任务中得到了讨厌的错误。

Why?

从文档中(注意最后一行):

boolean java.util.Optional.isEmpty()

If a value is not present, returns true, otherwise false.
Returns:true if a value is not present, otherwise false
Since:11