“Cannot find symbol”编译错误是什么意思?

1.“Cannot find symbol”错误是什么意思?

首先,它是编译错误1。这意味着,无论有在Java源代码中的问题,或有在你编译它的方式有问题。

您的Java源代码包含以下内容:

关键词:像true,false,class,while,等。

文字:像42和'X'和"Hi mum!"。

运营商和其他非字母数字标记:像+,=,{,等等。

标识符:像Reader,i,toString,processEquibalancedElephants,等。

注释和空白。

“Cannot find symbol”错误与标识符有关。编译代码时,编译器需要确定代码中每个标识符的含义。

“Cannot find symbol”错误意味着编译器无法执行此操作。您的代码似乎是指编译器无法理解的内容。

2.什么可能导致“Cannot find symbol”错误?

编译器查找了应该定义标识符的所有位置,并且找不到定义。这可能是由许多事情引起的。常见的如下:

对于标识符一般:也许你拼错了名字; 即StringBiulder代替StringBuilder。Java不能也不会尝试弥补拼写错误或输入错误。

也许你弄错了; 即stringBuilder代替StringBuilder。所有Java标识符都区分大小写。

也许你不恰当地使用了下划线; 即mystring和my_string不同。(如果你遵守Java风格规则,你将在很大程度上受到这种错误的保护...)

也许你正在尝试使用被宣称为“其他地方”的东西; 即在一个不同的上下文中,你隐含地告诉编译器。(一个不同的类?一个不同的范围?一个不同的包?一个不同的代码库?)

对于应引用变量的标识符:也许你忘了申报变量了。

也许变量声明在您尝试使用它时不在范围内。(见下面的例子)

对于应该是方法或字段名称的标识符:

也许您正在尝试引用未在父/祖先类或接口中声明的继承方法或字段。

也许您正在尝试将方法用作字段,反之亦然; 例如"someString".length或someArray.length()。

对于应该是类名的标识符:也许你忘了导入课程。

也许您使用了“星型”导入,但未在您导入的任何包中定义该类。

也许你忘记了new:

String s = String(); // should be 'new String()'

对于类型或实例似乎没有您期望的成员的情况:也许您已经声明了一个嵌套类或泛型参数,它们会影响您要使用的类型。

也许您正在隐藏静态或实例变量。

也许你导入了错误的类型; 例如,由于IDE完成或自动更正。

也许您正在使用(编译)错误版本的API。

也许您忘了将对象转换为适当的子类。

问题通常是上述的组合。例如,也许你“*”导入java.io.*,然后尝试使用Files类...这java.nio不是java.io。或许你打算写File...这是一个班级java.io。

以下是不正确的变量范围如何导致“Cannot find symbol”错误的示例:

for (int i = 0; i < strings.size(); i++) {

if (strings.get(i).equalsIgnoreCase("fnoord")) {

break;

}

}

if (i < strings.size()) {

...

}

这将i在if语句中给出“Cannot find symbol”错误。虽然我们之前已经声明i,但该声明仅适用于for声明及其正文。以参考i在if声明中无法看到的那个声明i。它超出了范围。

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

这是一个导致困惑的例子,其中拼写错误导致看似无法解释的“Cannot find symbol”错误:

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

System.out.println("i is " + i);

}

这将在println调用中显示i无法找到的编译错误。但是(我听到你说)我确实宣布了!

问题是之前的鬼鬼祟祟的分号{。Java语言将其定义为空语句。所以代码实际上意味着:

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

{

System.out.println("i is " + i);

}

该{ ... }块不是for循环的主体,因此声明i不在块的范围内。

这是由拼写错误引起的“Cannot find symbol”错误的另一个示例。

int tmp = ...

int res = tmp(a + b);

尽管与先前的声明中,tmp在tmp(...)表达是错误的。编译器将查找一个名为的方法tmp,但不会找到一个方法。先前声明的tmp是变量的名称空间,而不是方法的名称空间。

在我遇到的例子中,程序员实际上已经遗漏了一个操作员。他打算写的是这样的:

int res = tmp * (a + b);

如果从命令行编译,编译器可能Cannot find symbol还有另一个原因。您可能只是忘记编译或重新编译其他类。举例来说,如果你有类Foo和Bar地方Foo使用Bar。如果您从未编译过Bar并且运行过javac Foo.java,则可能会发现编译器找不到该符号Bar。简单的答案就是Foo和Bar在一起; 例如javac Foo.java Bar.java或javac *.java。或者更好的是仍然使用Java构建工具; 例如Ant,Maven,Gradle等。

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

3.如何修复这些错误?

一般来说,您首先要弄清楚导致编译错误的原因。

查看编译错误消息指示的文件中的行。

确定错误消息正在讨论的符号。

弄清楚为什么编译器说它Cannot find symbol; 往上看!

然后你想想你的代码应该说些什么。最后,您需要确定需要对源代码进行哪些更正才能执行您想要的操作。

请注意,并非每个“校正”都是正确的。考虑一下:

for (int i = 1; i < 10; i++) {

for (j = 1; j < 10; j++) {

...

}

}

假设编译器说“Cannot find symbol” j。有很多方法可以“修复”:

我可以改变内for到for (int j = 1; j < 10; j++)-可能是正确的。

我可以在内循环或外循环j 之前添加一个声明- 可能是正确的。forfor

我可以改变j,以i在内部for循环-可能是错的!

等等。

关键是您需要了解代码尝试执行的操作才能找到正确的修复方法。

4.模糊的原因

以下是一些“Cannot find symbol”看似莫名其妙的情况......直到你仔细观察。

1.不正确的依赖项:如果您使用的是管理构建路径和项目依赖项的IDE或构建工具,那么您可能在依赖项方面犯了错误; 例如,遗漏了依赖关系,或选择了错误的版本。如果您使用的是构建工具(Ant,Maven,Gradle等),请检查项目的构建文件。如果您使用的是IDE,请检查项目的构建路径配置。

2.您没有重新编译:有时会发生新的Java程序员不了解Java工具链的工作原理,或者没有实现可重复的“构建过程”; 例如,使用IDE,Ant,Maven,Gradle等。在这种情况下,程序员最终可能会追逐他的尾巴寻找一个虚幻的错误,这个错误实际上是由于没有正确地重新编译代码而导致的......等等......

3.较早的构建问题:早期构建可能以给出缺少类的JAR文件的方式失败。如果您使用构建工具,通常会注意到这样的故障。但是,如果您从其他人那里获取JAR文件,则依赖于它们正确构建并注意错误。如果您怀疑这一点,请使用tar -tvf列出可疑JAR文件的内容。

4.IDE问题:人们已经报告了他们的IDE混淆的情况,并且IDE中的编译器找不到存在的类......或者相反的情况。

如果IDE的缓存与文件系统不同步,则会发生这种情况。有IDE特定的方法来解决这个问题。

这可能是一个IDE错误。例如,@ Joel Costigliola描述了Eclipse无法正确处理Maven“测试”树的场景:请参阅此答案。

5.重新定义系统类:我已经看到了编译器抱怨这substring是一个未知符号的情况,如下所示

String s = ...

String s1 = s.substring(1);

事实证明,程序员已经创建了自己的版本,String并且他的类版本没有定义substring方法。

课程:不要使用与公共库类相同的名称来定义自己的类!

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

您可以通过将自己限制为ASCII或Latin-1作为源文件编码,并将Java \uxxxx转义用于其他字符来避免这种情况。

java程序编译错误属于异常吗_“Cannot find symbol”编译错误是什么意思?相关推荐

  1. 第一百五十期:Java程序员必备:异常的十个关键知识点

    总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油.异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异常.  前言 总结了Jav ...

  2. Java程序员必备:异常的十个关键知识点

    前言 总结了Java异常十个关键知识点,面试或者工作中都有用哦,加油. 一. 异常是什么 异常是指阻止当前方法或作用域继续执行的问题.比如你读取的文件不存在,数组越界,进行除法时,除数为0等都会导致异 ...

  3. java程序源代码如何保存到桌面_如何编写JAVA小白第一个程序

    学习上一篇文章之后,确定好JDK和环境变量都成功之后,我们来编写我们第一个java程序命名为HelloWorld.java. 上一篇文章链接:JDK下载与环境变量的安装 桌面上右击,新建一个文本文档 ...

  4. java程序的基本组成单元是_二、JAVA语言基础

    1. Java程序的基本结构 JAVA是面向对象的程序设计语言,JAVA程序的基本组成单元是类,类中又包含属性与方法两部分,每一个应用程序都必须包含一个main()方法,含有main()方法的类称为主 ...

  5. 编译java程序时用于指定生成class_(15 )在编译 Java 程序时,用于指定生成 .class 文件位置的选项是A ) -g B ) -d C ) -verbose D...

    (15 )在编译 Java 程序时,用于指定生成 .class 文件位置的选项是A ) -g B ) -d C ) -verbose D 更多相关问题 如图①,在△ABC中,AB=AC,∠BAC=90 ...

  6. java程序实现可移植性依靠的是_什么是JAVA的可移植性

    JAVA的可移植性: 1.JAVA作为一种编程语言:源代码可移植性 作为一种编程语言,JAVA提供了一种最简单同时也是人们最熟悉的可移植性–源代码移植.这意味着任意一个JAVA程序,不论它运行在何种C ...

  7. 怎样让java程序在别的电脑上运行_有关java桌面应用如何在别的电脑上运行

    本人找了很久,终于在某位大神的点播下,明白如何让自己写的java程序,在别的电脑上运行,真正和他人一起分享你成功的喜悦. 首先我们都知道java程序是运行在java虚拟机上的,所以要想运行class文 ...

  8. java程序员一般用什么笔记本_购买适合程序员编程开发用的笔记本电脑的几点建议...

    Hello,everybody!最近在论坛里看到很多人在问购买程序员编程用的笔记本电脑有什么建议,作为一名前Java程序员,我说说我工作几年后对笔记本电脑要求的几点建议,也希望看到这篇文章的朋友,内心 ...

  9. java程序中类的成员变量定义在_.在类体中,变量定义部分所定义的变量称为类的________。...

    .在类体中,变量定义部分所定义的变量称为类的________. .成员变量在整个类内都有效,________变量只在定义它的方法内有效. .Java中成员变量又分为实例成员变量和________. . ...

最新文章

  1. 数通手稿留档——ISIS
  2. java实例变量成员变量_Java的类成员变量、实例变量、类变量,成员方法、实例方法、类方法...
  3. 大战C100K之-Linux内核调优篇--转载
  4. DCT算法的原理及实现简介
  5. OpenCV安全屏障摄像机Security Barrier Camera的实例(附完整代码)
  6. 访问tomcat manager应用遇到的403 access denied错误
  7. 前端学习(1307):模块查找规则二
  8. x264函数调用关系图
  9. 互联网系统架构的演进
  10. pycharm怎么修改python路径
  11. 数学之美_正态分布(详解)
  12. EMNLP'21 | 学习改写非自回归机器翻译的翻译结果
  13. The GenerateResource task failed unexpectedly. a generic error occured in GDI+
  14. 心有多高 未来就有多远
  15. php出语句,PHP语句_php
  16. Linux系统中用源代码编译安装软件和查看进程
  17. swift moya框架+rxswift+handyjson+SwiftyJSON封装和使用教程
  18. autorunner
  19. UCF Local Programming Contest 2018题解
  20. Task5 | CFA (Amos+Mplus) | 五因素心智觉知度量表:正念是什么?

热门文章

  1. css 设置背景图一半_img只显示图片一部分 或 css设置背景图片只显示图片指定区域...
  2. 不惧新冠疫情 DDN公司销售收入逆势增长
  3. 算法设计——质数的乘积
  4. 兴趣爱好选择程序java+Swing界面
  5. 关于表格分页缓存数据
  6. Android 简易QQ登录页面
  7. android简历!剖析Android开发未来的出路在哪里,Android篇
  8. <人生重开模拟器>——《Python项目实战》
  9. jibx工具使用和遇到的问题。环境部署、组件bind、解组编组
  10. node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。