请解释以下关于“无法找到符号”,“无法解析符号”或“符号未找到”的错误(在Java中):
它们是什么意思? 什么东西会引起它们? 程序员如何着手修复它们?
本问题旨在针对Java中常见的编译错误进行全面的问答。
请解释以下关于“无法找到符号”,“无法解析符号”或“符号未找到”的错误(在Java中):
它们是什么意思? 什么东西会引起它们? 程序员如何着手修复它们?
本问题旨在针对Java中常见的编译错误进行全面的问答。
当前回答
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
其他回答
回复: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包含了所有预期的类,所有的东西都编译好了。
再举一个"变量超出范围"的例子
这类问题我已经见过几次了,也许是另一个例子,说明什么是非法的,即使它可能感觉不错。
考虑下面的代码:
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);
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
如果eclipse Java构建路径映射到7、8和Project pom.xml中的Maven属性Java。version提到了更高的Java版本(9,10,11等),而不是7,8,你需要在pom.xml文件中更新。
在Eclipse中,如果Java被映射到Java版本11,而在pom.xml中,它被映射到Java版本8。在Eclipse IDE中执行以下步骤将Eclipse支持更新到Java 11 帮助->安装新软件->
在Work With中粘贴以下链接http://download.eclipse.org/eclipse/updates/4.9-P-builds
or
添加(弹出窗口将打开)->
名称:Java 11支持 地点:http://download.eclipse.org/eclipse/updates/4.9-P-builds
然后更新Java版本的Maven属性的pom.xml文件如下
<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
最后右键单击项目Debug as -> Maven清洁,Maven构建步骤
如果你忘记了new,你也会得到这个错误:
String s = String();
与
String s = new String();
因为不带new关键字的调用将尝试寻找一个名为String而不带参数的(本地)方法——而且该方法签名可能没有定义。