Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “找不到符号”或“无法解析符号”错误是什么意思?_Java_Compiler Errors_Cannot Find Symbol - Fatal编程技术网

Java “找不到符号”或“无法解析符号”错误是什么意思?

Java “找不到符号”或“无法解析符号”错误是什么意思?,java,compiler-errors,cannot-find-symbol,Java,Compiler Errors,Cannot Find Symbol,请解释以下关于Java中找不到符号、无法解析符号或找不到符号的错误: 它们是什么意思? 什么事情会导致它们? 程序员如何着手修复它们? 这个问题旨在对Java中的这些常见编译错误进行全面的问答。0。这两个错误之间有什么区别吗? 不是真的。找不到符号、无法解析符号和找不到符号都表示相同的内容。不同的Java编译器使用不同的术语 1.找不到符号错误意味着什么? 首先,这是一个编译错误1。这意味着要么Java源代码中存在问题,要么编译它的方式存在问题 Java源代码由以下内容组成: 关键词:如真、假、

请解释以下关于Java中找不到符号、无法解析符号或找不到符号的错误:

它们是什么意思? 什么事情会导致它们? 程序员如何着手修复它们? 这个问题旨在对Java中的这些常见编译错误进行全面的问答。

0。这两个错误之间有什么区别吗? 不是真的。找不到符号、无法解析符号和找不到符号都表示相同的内容。不同的Java编译器使用不同的术语

1.找不到符号错误意味着什么? 首先,这是一个编译错误1。这意味着要么Java源代码中存在问题,要么编译它的方式存在问题

Java源代码由以下内容组成:

关键词:如真、假、类、while等。 文字:比如42和“X”还有“嗨,妈妈!”!。 运算符和其他非字母数字标记:如+、=、{,等等。 标识符:如Reader、i、toString、processequivalancedelephants等。 注释和空白。 找不到符号错误与标识符有关。编译代码时,编译器需要计算代码中每个标识符的含义

找不到符号错误意味着编译器无法执行此操作。您的代码似乎引用了编译器不理解的内容

2.什么会导致找不到符号错误? 首先,原因只有一个。编译器查找了应该定义标识符的所有位置,但找不到定义。这可能是由多种原因造成的。常见的原因如下:

对于一般标识符:

可能您拼写错误;例如,StringBiulder而不是StringBuilder。Java不能也不会试图弥补拼写错误或键入错误。 可能您的大小写搞错了,即stringBuilder而不是stringBuilder。所有Java标识符都区分大小写。 也许你使用下划线不恰当,例如mystring和my_字符串是不同的。如果你坚持Java风格的规则,你将在很大程度上避免这个错误。。。 可能您正试图使用在其他地方声明的内容;例如,在不同的上下文中,您隐式地告诉编译器要查看的内容。不同的类?不同的范围?不同的包?不同的代码库? 对于应引用变量的标识符:

也许您忘记声明变量了。 可能变量声明在您尝试使用它时超出了范围。请参见下面的示例 对于应为方法或字段名的标识符:

可能您正试图引用未在父/祖先类或接口中声明的继承方法或字段

可能您正试图引用一个不存在的方法或字段,即尚未在您使用的类型中声明;例如someString.push2

可能您正在尝试将方法用作字段,或者反之亦然;例如someString.length或somesarray.length

可能您错误地操作了数组而不是数组元素;例如

    String strings[] = ...
    if (strings.charAt(3)) { ... }
    // maybe that should be 'strings[0].charAt(3)'
对于应为类名的标识符:

也许你忘了导入这个类

也许您使用了星型导入,但是在您导入的任何包中都没有定义该类

也许您忘记了一个新的,如:

对于类型或实例似乎没有您期望的成员的情况:

可能您已经声明了一个嵌套类或泛型参数,该类或泛型参数隐藏了您想要使用的类型。 也许您正在隐藏一个静态或实例变量。 可能您导入了错误的类型;例如,由于IDE完成或自动更正。 也许您使用的是错误版本的API编译。 也许您忘了将对象强制转换为适当的子类。 问题通常是上述因素的组合。例如,可能您先导入了java.io.*,然后尝试使用Files类…它在java.nio中而不是java.io中。或者可能您打算编写File…它是java.io中的一个类

下面是一个不正确的变量作用域如何导致找不到符号错误的示例:

List<String> strings = ...

for (int i = 0; i < strings.size(); i++) {
    if (strings.get(i).equalsIgnoreCase("fnord")) {
        break;
    }
}
if (i < strings.size()) {
    ...
}
for (int i = 0; i < 100; i++); {
    System.out.println("i is " + i);
}
这会在println调用中给你一个编译错误,说找不到我。但我听说你说我确实声明了它

问题在于{之前的分号。Java语言语法将该上下文中的分号定义为空语句。空语句随后成为for循环的主体。因此,该代码实际上意味着:

for (int i = 0; i < 100; i++); 

// The previous and following are separate statements!!

{
    System.out.println("i is " + i);
}
尽管有前面的声明,tmp…表达式中的tmp是错误的。编译器将查找名为tmp的方法,但找不到。前面声明的tmp位于变量的命名空间中,而不是方法的命名空间中。

在我遇到的例子中,程序员实际上遗漏了一个操作符。他想写的是:

int res = tmp * (a + b);
如果从命令行编译,编译器可能找不到符号还有另一个原因。您可能只是忘记编译或重新编译其他类。例如,如果您有类Foo和Bar,其中Foo使用Bar。如果您从未编译过Bar,并且运行了javac Foo.java,那么您可能会发现编译器找不到符号栏。简单的答案是一起编译Foo和Bar;e、 g.javac Foo.java Bar.java或javac*.java。或者最好还是使用Java构建工具;e、 蚂蚁、马文、格拉德尔等等

还有其他一些更模糊的原因。。。我将在下面讨论

3.如何修复这些错误? 一般来说,首先要找出编译错误的原因

查看编译错误消息指示的文件中的行。 识别错误消息所指的符号。 找出编译器为什么说找不到符号;看上面! 然后考虑代码应该说什么。最后,您需要对源代码进行什么样的修改才能实现您想要的功能

请注意,并非所有更正都是正确的。考虑这一点:

for (int i = 1; i < 10; i++) {
    for (j = 1; j < 10; j++) {
        ...
    }
}
事实证明,程序员已经创建了他们自己版本的字符串,而他版本的类没有定义子字符串方法

教训:不要用与公共库类相同的名称定义自己的类

同形符:如果对源文件使用UTF-8编码,可能会有看起来相同但实际上不同的标识符,因为它们包含同形符。有关更多信息,请参阅

您可以通过将自己限制为ASCII或拉丁语-1作为源文件编码,并对其他字符使用Java\uxxx转义来避免这种情况

1-如果您可能在运行时异常或错误消息中看到这一点,那么您可能已将IDE配置为运行带有编译错误的代码,或者您的应用程序正在生成和编译代码。。在运行时


2-土木工程的三个基本原则:水不上坡,木板侧边更结实,你不能推绳子。

如果你忘记了一个新的:

String s = new String();
因为不带new关键字的调用将尝试查找名为String的本地方法(不带参数),并且该方法签名可能未定义。

还有一个“Variable超出范围”的示例

正如我已经见过几次这样的问题,也许再举一个例子来说明什么是非法的,即使它可能感觉不错

考虑以下代码:

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值预先分配给外部作用域中的变量名,然后在以下情况下重新分配:

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

如果您在其他地方的构建中遇到这个错误,而您的IDE说一切都很好,那么请检查您在这两个地方使用的Java版本是否相同


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

在Eclipse中获取此错误的一种方法:

在src/test/java中定义一个类a。 在src/main/java中定义另一个使用类A的类B。 结果:Eclipse将编译代码,但maven将给出“找不到”符号

根本原因:Eclipse正在使用主树和测试树的组合构建路径。不幸的是,它不支持对Eclipse项目的不同部分使用不同的构建路径,这正是Maven所需要的

解决方案:

不要这样定义依赖关系;i、 不要犯这个错误。 定期使用Maven构建您的代码库,以便尽早发现这个错误。一种方法是使用CI服务器。
我也犯了这个错误。为此,我在谷歌上搜索了一下,并被引导到了这个页面

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

error: cannot find symbol
解决方案:我首先建立了一个项目来解决这个问题
od是在调用方法的项目中定义的。

有关提示,请仔细查看引发错误的类名和行号,例如: 编译失败 [错误]\applications\xxxxx.java:[44,30]错误:找不到符号

另一个原因是不支持java版本的方法,比如jdk7 vs 8。
检查您的%JAVA\u 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);
      }
}
现在看看新的输出


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

如上所述,可能会出现各种情况。有几件事帮助我解决了这个问题

如果您正在使用IntelliJ

文件->“使缓存无效/重新启动”

被引用的类位于另一个项目中,并且该依赖项未添加到我的项目的Gradle生成文件中。因此,我使用

编译项目“:另一个项目”


它成功了。嗯

如果eclipse Java构建路径映射到7,8,并且在项目pom.xml中提到Java.version属性Java.version高于Java版本9,10,11等,则需要在pom.xml文件中更新

在Eclipse中,如果Java映射到Java版本11,那么在pom.xml中,它映射到Java版本8。通过在EclipseIDE中执行以下步骤,将Eclipse支持更新为Java11 帮助->安装新软件->

在工作时使用粘贴以下链接

添加弹出窗口将打开->

名称:Java11支持 地点:

然后在pom.xml文件的Maven属性中更新Java版本,如下所示

<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>

最后,右键单击project Debug as->Maven clean,Maven build steps

您使用Maven compile编译了代码,然后使用Maven test运行代码,效果良好。现在,如果您更改了代码中的某些内容,然后在未编译的情况下运行它,则会出现此错误


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

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

将context.xml文件从src/java/package移动到资源目录IntelliJ 集成电路设备 清除目标目录。 解决

使用IntelliJ


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

我们在一个Java项目中发现了错误,该项目被设置为Gradle多项目构建。事实证明,其中一个子项目没有完成。 这会阻止子项目的类文件对生成中的其他项目可见

以以下方式将Java库插件添加到子项目的build.gradle后,错误消失了:

plugins {
    ...
    id 'java-library'
}
我这样解决了这个错误。。。android的疯狂。我将包名作为适配器,并使用a而不是a将名称重构为适配器,并解决了错误。

它们是什么意思? 这三个语句的意思是相同的:找不到符号、无法解析符号和找不到符号。 现在,错误的意思是编译器无法理解已定义符号的引用。或者只是编译器不能做到这一点

原因与修复方法
如果您在其他地方的构建中遇到这个错误,而您的IDE说一切都很好,那么请检查您在这两个地方使用的Java版本是否相同。如果您在其他地方的构建中遇到此错误,并且您的IDE表示一切正常,请检查这两个地方是否使用相同的Java版本


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

意味着编译器无法找到此变量、类或运算符

如何修复? 我面对这个错误,尝试了所有的解决方法

对我来说,有效的方法是将我的类重命名为任何其他名称,并且猜测它有效


编译器似乎有问题。

在将类文件导入到新的Eclipse项目(包括主类文件)后,我出现了此错误。经过反复试验后,我将导致此错误的类文件移动到我的src文件夹中,并将运行配置设置为主类的确切名称,从而修复了此问题。

我遇到了另一种情况,即当eclipse没有运行时发生了此编译错误

ee问题:两个类分别在另一个类中定义了依赖项。在我的例子中,我有一个枚举,实现了一个接口,它是在一个类中定义的,在这个类中我愚蠢地已经使用了枚举。从控制台编译它会引发一系列无法找到的符号错误,这些错误通常与导入中的最后一个元素相关。我不知道是什么原因导致了这种情况,因为代码中没有任何错误。另一个问题是IDE可能会将其他错误解释为这一类。例如,System.out.println中的println如果放在标准编译器下的类级别,将给出预期的结果,但在IntelliJ中,我们将看到无法解析符号“println”。哇。我会称之为编译器错误。Intellij似乎在需要声明的语句中使用了语法无效的东西,然后试图解析符号。但是编译器已经非常混乱,无法解析应该解析的符号。。。如果该语句在正确的上下文中,则会解决此问题。这导致了一个误导性的编译错误消息。这个问题的解决方案是什么?无论您在src/main/java中使用什么,都需要在src/main/java中定义,或者在任何编译/运行时依赖项中定义,而不是在测试依赖项中定义。java没有free或delete运算符,因此,它必须依靠跟踪变量范围来找出变量何时不再与这些原因变量的引用一起使用。-虽然这是事实,但并不相关。C和C++分别有Frutel/Delphi操作符,但是与实例类似的C/C++代码是非法的。C和C++块限制变量的范围,就像java一样。事实上,大多数块结构语言都是如此。对于在每个分支上分配不同值的代码,更好的解决方案是使用变量声明。这与其他答案所说的是一样的。是的,如果您决定将一些可重用函数从当前包移到通用UTIL包,例如,但是在从当前包调用函数之前忘记编译公共包。在不考虑引用的情况下移动文件可能会导致此错误。我已经见过这个了。只需在Git上重置并小心地再次移动,错误就会解决。这在很大程度上取决于情况,通常不会。这对我来说很有效。我无法理解,因为包/目录都是正确的。似乎需要重新构建以合并更改。在扫描我的代码大约一个小时后,我找到了这个答案-感谢上帝!这不是Android特有的,也不是疯狂。Java标识符区分大小写。类名/包名的大小写应与相应源文件、目录和.class文件的大小写匹配。如果你搞砸了,那么工具链很可能找不到相关的文件。谢谢你的澄清。这个解释没有意义。找不到符号错误是编译错误。在>>运行>编译时不会发生同样的情况,我很困惑您在没有编译测试代码的情况下编译了测试。除非出于某种原因,他们在不同的项目中。如果您运行mvn测试,那么应该重新编译项目中的所有内容。。。在运行测试之前。如果您运行mvn surefile:test,则不应重新编译任何内容。对我来说,这听起来是一个不正确的解决方案:您不需要将.class文件放入源目录。不管是哪种情况,你都没有清楚地描述你是如何陷入这种情况的,或者你做了什么来解决它。所以这个答案对于其他人来说是很难应用的,不管它是否正确。
class demo{ 
      public static void main(String a[]){
             System.out.print(name);
      }
}
class demo{ 
      public static void main(String a[]){

             String name="smith";

             System.out.print(name);
      }
}
<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
plugins {
    ...
    id 'java-library'
}