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

请解释以下关于“的内容”;找不到符号“&引用;无法解析符号“;或;“未找到符号”;错误(在Java中):

  • 它们是什么意思
  • 什么事情会导致它们
  • 程序员如何着手修复它们

这个问题旨在引发一场全面的问答比赛;有关Java中常见编译错误的详细信息。

0。这两个错误之间有什么区别吗

不是真的&引用;找不到符号“&引用;无法解析符号“;及;“未找到符号”;所有的意思都是一样的。不同的Java编译器使用不同的术语

一,。“找不到符号”错误是什么意思

首先,这是一个编译错误。这意味着,或者您的Java源代码中存在问题,或者您编译它的方式存在问题

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

  • 关键词:如classwhile,等等
  • 文字:如truefalse42'X'"嗨,妈妈&引用
  • 运算符和其他非字母数字标记:如+={,等等
  • 标识符:如ReaderitoStringprocessequivalancedelephants,等等
  • 注释和空白

“找不到符号”错误与标识符有关。编译代码时,编译器需要计算代码中每个标识符的含义

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

2.什么会导致“找不到符号”错误

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

  • 对于一般标识符:

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

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

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

    • 可能您试图引用的方法或字段在您使用的类型中不存在(即尚未声明);例如,“rope”".push()2

    • 可能您正试图将某个方法用作字段,反之亦然;例如“rope”.lengthsomeArray.length()

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

      字符串[]=。。。
      if(strings.charAt(3)){…}
      //可能应该是“字符串[0]。字符(3)”
      
  • 对于应为类名的标识符:

    • 也许你忘了导入这个类

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

    • 可能您忘记了一个新的,如:

      String s=String();//应为“new String()”
      
  • 对于类型或实例似乎没有您期望的成员(例如方法或字段)的情况:

    • 可能您已经声明了一个嵌套类或泛型参数,该类或泛型参数将隐藏到您想要使用的类型中
    • 也许您正在隐藏一个静态或实例变量
    • 可能您导入了错误的类型;例如,由于IDE完成或自动更正,可能建议使用java.awt.List,而不是java.util.List
    • 也许您正在使用(针对)错误版本的API
    • 也许您忘了将对象强制转换为适当的子类
    • 也许您已经将变量的类型声明为具有您要查找的成员的类型的超类型

问题通常是上述因素的组合。例如,可能您“star”导入了java.io.*,然后尝试使用Files类…它位于java.nio中,而不是java.io。或者可能您打算编写File,它java.io中的一个类


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

列表<字符串>字符串=。。。
对于(int i=0;i<strings.size();i++){
if(strings.get(i).equalsIgnoreCase("fnord"){
打破
}
}
if(i<strings.size()){
...
}

这将在if语句中为i给出一个“找不到符号”错误。尽管我们之前声明了i,但该声明仅在for语句及其主体的范围内。在if语句中对i的引用无法看到该声明在i的上。它超出范围

(这里一个适当的更正可能是将if语句移动到循环中,或者在循环开始之前声明i。)


以下是一个导致困惑的示例,其中打字错误导致看似无法解释的“找不到符号”错误:

用于(int i=0;i<100;i++){
System.out.println(“i是”+i);
}

这将在println调用中给您一个编译错误,表示找不到i。但是(我听到您说)我确实声明了它

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

用于(int i=0;i<100;i++);
//前面和下面是单独的陈述!!
{
System.out.println(“i是”+i);
}

{…}块不是for循环的主体,因此for语句中先前的i声明超出了块中的范围


这里是另一个由打字错误导致的“找不到符号”错误示例

inttmp=。。。
int res=tmp(a+b);

尽管有前面的声明,但tmp(…)表达式中的tmp是错误的。编译器将查找名为tmp的方法,但找不到。前面声明的tmp位于变量的命名空间中,而不是方法的命名空间中

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

int res=tmp*(a+b);

如果您是从命令行编译,编译器可能找不到符号还有另一个原因。您可能只是忘记编译或重新编译其他类。例如,如果您有类FooBar,其中Foo使用Bar。如果您从未编译Bar当你运行javac Foo.java,你会发现编译器找不到符号Bar。简单的答案是将FooBar一起编译;例如javac Foo.java Bar.javajavac*.java。或者更好的方法是使用java构建工具;例如Ant、Maven、Gradle等等

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

3.如何修复这些错误

一般来说,首先要找出编译错误的原因

  • 查看编译错误消息指示的文件中的行
  • 识别错误消息所指的符号
  • 找出编译器说找不到符号的原因;参见上文

然后你想一想你的代码应该说些什么,最后你想一想你需要对源代码做什么样的修改才能达到你想要的效果

请注意,不是每一个“校正”都是正确的。

用于(int i=1;i<10;i++){
对于(j=1;j<10;j++){
...
}
}

假设编译器对j说“找不到符号”。有很多方法可以“修复”:

发表评论