请解释以下关于“无法找到符号”,“无法解析符号”或“符号未找到”的错误(在Java中):
它们是什么意思? 什么东西会引起它们? 程序员如何着手修复它们?
本问题旨在针对Java中常见的编译错误进行全面的问答。
请解释以下关于“无法找到符号”,“无法解析符号”或“符号未找到”的错误(在Java中):
它们是什么意思? 什么东西会引起它们? 程序员如何着手修复它们?
本问题旨在针对Java中常见的编译错误进行全面的问答。
当前回答
正如人们上面提到的,可能有各种各样的情况。有几件事帮助我解决了这个问题。
如果您正在使用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);
我是这样解决这个错误的……疯狂的机器人。我有包的名称为适配器和我重构名称适配器与“a”而不是“a”,并解决了这个错误。
如果您在其他地方的构建中遇到此错误,而您的IDE表示一切正常,那么请检查您在两个地方使用的Java版本是否相同。
例如,Java 7和Java 8有不同的API,因此在较旧的Java版本中调用不存在的API会导致此错误。
在Eclipse中获得此错误的一种方法是:
在src/test/java中定义一个类a。 在src/main/java中定义另一个使用类A的类B。
结果:Eclipse将编译代码,但maven将给出“无法找到符号”。
潜在原因:Eclipse为主树和测试树使用了一个组合的构建路径。不幸的是,它不支持为Eclipse项目的不同部分使用不同的构建路径,而这正是Maven所要求的。
解决方案:
不要那样定义你的依赖关系;也就是说,不要犯这样的错误。 定期使用Maven构建代码库,以便尽早发现这个错误。实现这一点的一种方法是使用CI服务器。
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