others - Java -"Cannot find symbol"编译错误意味着什么?

请解释以下关于"Cannot find symbol "错误的信息:

  • 这个错误意味着什么?
  • 什么事情会导致这个错误?
  • 程序员如何解决这个错误?
时间:

如果你忘记了new,你也会得到此错误:


String s = String();



相对于


String s = new String();



'变量超出范围'的另一个例子

如我已经看到过几次这样的问题,也许还有一个例子可能是非法的。

考虑以下代码:


if(somethingIsTrue()) {


 String message ="Everything is fine";


} else {


 String message ="We have an error";


}


System.out.println(message);



这是无效代码,因为名为message 的两个变量都不在各自的范围之外可见,这将是本例中的包围括号{},。

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


String message ="We have an error";


if(somethingIsTrue()) {


 message ="Everything is fine";


} 


System.out.println(message);



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

  • src/test/java中定义类A
  • src/main/java中定义另一个使用类A的类B

结果:Eclipse会编译代码,但是,Maven将给出"Cannot find symbol"

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

解决方法:

  • 不要以这种方式定义依赖关系; 换句话说,不要犯这个错误,
  • 使用Maven定期构建代码库,以便尽早发现这个错误,一种方法是使用CI服务器。

如果你在其他地方获得了这个错误,你的IDE表示所有内容都是完全正确的。

例如,Java 7和Java 8有不同的API,所以,在旧的Java版本中调用不存在的API会导致这个错误。

我也收到这个错误。 (我搜索了它,我被定向到这个页面)

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


error: cannot find symbol



就像上面提到的,可以有多种场景,有一些办法帮助我解决了这个问题。

如果你使用IntelliJ

File -> 'Invalidate Caches/Restart'

或者

被引用的类在另一个项目中,并且该依赖项没有添加到我的项目的Gradle构建文件中。 因此,我使用了

compile project(':anotherProject')

它就起作用了。

...