Java “找不到符号”或“无法解析符号”错误是什么意思?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/25706216/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
What does a "Cannot find symbol" or "Cannot resolve symbol" error mean?
提问by Stephen C
Please explain the following about "Cannot find symbol" and "Cannot resolve symbol" errors:
请解释以下有关“找不到符号”和“无法解析符号”错误的说明:
- What does they mean?
- What things can cause them?
- How does the programmer go about fixing them?
- 它们是什么意思?
- 什么事情会导致它们?
- 程序员如何修复它们?
This question is designed to seed a comprehensive Q&A about these common compilation errors in Java.
这个问题旨在就 Java 中这些常见的编译错误进行全面的问答。
采纳答案by Stephen C
0. Is there any difference between the two errors?
0. 这两个错误有什么区别吗?
Not really. "Cannot find symbol" and "Cannot resolve symbol" mean the same thing. Some Java compilers use one phrase, and some the other one.
并不真地。“找不到符号”和“无法解析符号”是同一个意思。一些 Java 编译器使用一种短语,而另一些则使用另一种。
1. What does a "Cannot find symbol" error mean?
1.“找不到符号”错误是什么意思?
Firstly, it is a compilation error1. It means that eitherthere is a problem in your Java source code, orthere is a problem in the way that you are compiling it.
首先,这是一个编译错误1。这意味着要么在您的 Java 源代码中存在问题,要么在您编译它的方式中存在问题。
Your Java source code consists of the following things:
您的 Java 源代码包含以下内容:
- Keywords: like
true
,false
,class
,while
, and so on. - Literals: like
42
and'X'
and"Hi mum!"
. - Operators and other non-alphanumeric tokens: like
+
,=
,{
, and so on. - Identifiers: like
Reader
,i
,toString
,processEquibalancedElephants
, and so on. - Comments and whitespace.
- 关键词:喜欢
true
,false
,class
,while
,等。 - 字面量:像
42
和'X'
和"Hi mum!"
。 - 运算符和其他非字母数字标记:如
+
、=
、{
等。 - 标识符:如
Reader
、i
、toString
、processEquibalancedElephants
等。 - 注释和空格。
A "Cannot find symbol" error is about the identifiers. When your code is compiled, the compiler needs to work out what each and every identifier in your code means.
“找不到符号”错误与标识符有关。编译代码时,编译器需要计算代码中每个标识符的含义。
A "Cannot find symbol" error means that the compiler cannot do this. Your code appears to be referring to something that the compiler doesn't understand.
“找不到符号”错误意味着编译器无法执行此操作。您的代码似乎指的是编译器不理解的内容。
2. What can cause a "Cannot find symbol" error?
2. 什么会导致“找不到符号”错误?
As a first order, there is only one cause. The compiler looked in all of the places where the identifier shouldbe defined, and it couldn't find the definition. This could be caused by a number of things. The common ones are as follows:
首先,只有一个原因。编译器查看了所有应该定义标识符的地方,但找不到定义。这可能是由多种原因造成的。常见的有以下几种:
- For identifiers in general:
- Perhaps you spelled the name incorrectly; i.e.
StringBiulder
instead ofStringBuilder
. Java cannot and will not attempt to compensate for bad spelling or typing errors. - Perhaps you got the case wrong; i.e.
stringBuilder
instead ofStringBuilder
. All Java identifiers are case sensitive. - Perhaps you used underscores inappropriately; i.e.
mystring
andmy_string
are different. (If you stick to the Java style rules, you will be largely protected from this mistake ...) - Perhaps you are trying to use something that was declared "somewhere else"; i.e. in a different context to where you have implicitly told the compiler to look. (A different class? A different scope? A different package? A different code-base?)
- Perhaps you spelled the name incorrectly; i.e.
- For identifiers that should refer to variables:
- Perhaps you forgot to declare the variable.
- Perhaps the variable declaration is out of scope at the point you tried to use it. (See example below)
For identifiers that should be method or field names:
- Perhaps you are trying to refer to an inherited method or field that wasn't declared in the parent / ancestor classes or interfaces.
- Perhaps you are trying to refer to a method or field that does not exist (i.e. has not been declared) in the type you are using; e.g.
"someString".push()
2. - Perhaps you are trying to use a method as a field, or vice versa; e.g.
"someString".length
orsomeArray.length()
. Perhaps you are mistakenly operating on an array rather than array element; e.g.
String strings[] = ... if (strings.charAt(3)) { ... } // maybe that should be 'strings[0].charAt(3)'
For identifiers that should be class names:
- Perhaps you forgot to import the class.
- Perhaps you used "star" imports, but the class isn't defined in any of the packages that you imported.
Perhaps you forgot a
new
as in:String s = String(); // should be 'new String()'
For cases where type or instance doesn't appear to have the member you were expecting it to have:
- Perhaps you have declared a nested class or a generic parameter that shadowsthe type you were meaning to use.
- Perhaps you are shadowing a static or instance variable.
- Perhaps you imported the wrong type; e.g. due to IDE completion or auto-correction.
- Perhaps you are using (compiling against) the wrong version of an API.
- Perhaps you forgot to cast your object to an appropriate subclass.
- 对于一般标识符:
- 也许你拼错了名字;即
StringBiulder
而不是StringBuilder
. Java 不能也不会试图弥补拼写错误或打字错误。 - 也许你弄错了;即
stringBuilder
而不是StringBuilder
. 所有 Java 标识符都区分大小写。 - 也许你不恰当地使用了下划线;即
mystring
和my_string
是不同的。(如果你坚持 Java 风格的规则,你将在很大程度上避免这个错误......) - 也许您正在尝试使用声明为“其他地方”的东西;即在与您隐式告诉编译器查看的地方不同的上下文中。(不同的类?不同的范围?不同的包?不同的代码库?)
- 也许你拼错了名字;即
- 对于应该引用变量的标识符:
- 也许你忘了声明变量。
- 也许变量声明在您尝试使用它时超出了范围。(见下例)
对于应该是方法或字段名称的标识符:
- 也许您正在尝试引用未在父/祖先类或接口中声明的继承方法或字段。
- 也许您正试图引用您正在使用的类型中不存在(即尚未声明)的方法或字段;例如
"someString".push()
2。 - 也许您正尝试将方法用作字段,反之亦然;例如
"someString".length
或someArray.length()
。 也许您错误地操作的是数组而不是数组元素;例如
String strings[] = ... if (strings.charAt(3)) { ... } // maybe that should be 'strings[0].charAt(3)'
对于应该是类名的标识符:
- 也许您忘记导入该类。
- 也许您使用了“星形”导入,但是在您导入的任何包中都没有定义该类。
也许你忘记了一个
new
:String s = String(); // should be 'new String()'
对于类型或实例似乎没有您期望的成员的情况:
- 也许您已经声明了一个嵌套类或一个泛型参数来隐藏您打算使用的类型。
- 也许您正在隐藏静态或实例变量。
- 也许你导入了错误的类型;例如,由于 IDE 完成或自动更正。
- 也许您正在使用(编译)错误版本的 API。
- 也许您忘记将对象强制转换为适当的子类。
The problem is often a combination of the above. For example, maybe you "star" imported java.io.*
and then tried to use the Files
class ... which is in java.nio
not java.io
. Or maybe you meant to write File
... which isa class in java.io
.
问题往往是上述问题的组合。例如,也许您“星级”导入java.io.*
,然后尝试使用Files
类 ...java.nio
不在 not 中java.io
。或者,也许你的意思是写File
......这是一类java.io
。
Here is an example of how incorrect variable scoping can lead to a "Cannot find symbol" error:
以下是不正确的变量范围如何导致“找不到符号”错误的示例:
List<String> strings = ...
for (int i = 0; i < strings.size(); i++) {
if (strings.get(i).equalsIgnoreCase("fnord")) {
break;
}
}
if (i < strings.size()) {
...
}
This will give a "Cannot find symbol" error for i
in the if
statement. Though we previously declared i
, that declaration is only in scopefor the for
statement and its body. The reference to i
in the if
statement cannot seethat declaration of i
. It is out of scope.
这将i
在if
语句中给出“找不到符号”错误。虽然我们先前声明i
,该声明只是在范围上的for
发言和它的身体。以参考i
在if
声明中无法看到的那个声明i
。它超出了范围。
(An appropriate correction here might be to move the if
statement inside the loop, or to declare i
before the start of the loop.)
(此处适当的更正可能是将if
语句移到循环内,或i
在循环开始之前声明。)
Here is an example that causes puzzlement where a typo leads to a seemingly inexplicable "Cannot find symbol" error:
这是一个令人困惑的示例,其中拼写错误导致看似莫名其妙的“找不到符号”错误:
for (int i = 0; i < 100; i++); {
System.out.println("i is " + i);
}
This will give you a compilation error in the println
call saying that i
cannot be found. But (I hear you say) I did declare it!
这将在println
调用中给您一个编译错误,说i
无法找到。但是(我听到你说)我确实声明了!
The problem is the sneaky semicolon ( ;
) before the {
. The Java language syntax defines a semicolon in that context to be an empty statement. The empty statement then becomes the body of the for
loop. So that code actually means this:
问题是偷偷摸摸的分号(;
)前{
。Java 语言语法将该上下文中的分号定义为空语句。空语句然后成为for
循环的主体。所以这段代码实际上意味着:
for (int i = 0; i < 100; i++);
// The previous and following are separate statements!!
{
System.out.println("i is " + i);
}
The { ... }
block is NOT the body of the for
loop, and therefore the previous declaration of i
in the for
statement is out of scopein the block.
该{ ... }
块不是for
循环体,因此之前的i
infor
语句声明超出了该块的范围。
Here is another example of "Cannot find symbol" error that is caused by a typo.
这是由拼写错误引起的“找不到符号”错误的另一个示例。
int tmp = ...
int res = tmp(a + b);
Despite the previous declaration, the tmp
in the tmp(...)
expression is erroneous. The compiler will look for a method called tmp
, and won't find one. The previously declared tmp
is in the namespace for variables, not the namespace for methods.
尽管有前面的声明,tmp
但tmp(...)
表达式中的 是错误的。编译器将查找名为 的方法tmp
,但不会找到。先前声明的tmp
是在变量的命名空间中,而不是在方法的命名空间中。
In the example I came across, the programmer had actually left out an operator. What he meant to write was this:
在我遇到的例子中,程序员实际上遗漏了一个运算符。他想写的是这样的:
int res = tmp * (a + b);
There is another reason why the compiler might not find a symbol if you are compiling from the command line. You might simply have forgotten to compile or recompile some other class. For example, if you have classes Foo
and Bar
where Foo
uses Bar
. If you have never compiled Bar
and you run javac Foo.java
, you are liable to find that the compiler can't find the symbol Bar
. The simple answer is to compile Foo
and Bar
together; e.g. javac Foo.java Bar.java
or javac *.java
. Or better still use a Java build tool; e.g. Ant, Maven, Gradle and so on.
如果您从命令行编译,编译器可能找不到符号还有另一个原因。您可能只是忘记编译或重新编译某个其他类。例如,如果您有类Foo
并且Bar
whereFoo
使用Bar
. 如果您从未编译过Bar
并运行javac Foo.java
,您很可能会发现编译器找不到符号Bar
。简单的答案是编译Foo
和Bar
在一起;例如javac Foo.java Bar.java
或javac *.java
。或者最好还是使用 Java 构建工具;例如 Ant、Maven、Gradle 等。
There are some other more obscure causes too ... which I will deal with below.
还有一些其他更模糊的原因......我将在下面处理。
3. How do I fix these errors ?
3. 如何修复这些错误?
Generally speaking, you start out by figuring out what causedthe compilation error.
一般来说,您首先要弄清楚是什么导致了编译错误。
- Look at the line in the file indicated by the compilation error message.
- Identify which symbol that the error message is talking about.
- Figure out whythe compiler is saying that it cannot find the symbol; see above!
- 查看编译错误消息指示的文件中的行。
- 确定错误消息所指的符号。
- 弄清楚为什么编译器说它找不到符号;看上面!
Then you thinkabout what your code is supposed to be saying. Then finally you work out what correction you need to make to your source code to do what you want.
然后你考虑你的代码应该说什么。最后,您要确定需要对源代码进行哪些更正才能执行您想要的操作。
Note that not every "correction" is correct. Consider this:
请注意,并非每个“更正”都是正确的。考虑一下:
for (int i = 1; i < 10; i++) {
for (j = 1; j < 10; j++) {
...
}
}
Suppose that the compiler says "Cannot find symbol" for j
. There are many ways I could "fix" that:
假设编译器对j
. 有很多方法可以“修复”:
- I could change the inner
for
tofor (int j = 1; j < 10; j++)
- probably correct. - I could add a declaration for
j
beforethe innerfor
loop, or the outerfor
loop - possibly correct. - I could change
j
toi
in the innerfor
loop - probably wrong! - and so on.
- 我可以将内部更改
for
为for (int j = 1; j < 10; j++)
- 可能是正确的。 - 我可以在内循环或外循环
j
之前添加一个声明- 可能是正确的。for
for
- 我可以在内循环中更改
j
为- 可能是错误的!i
for
- 等等。
The point is that you needto understand what your code is trying to do in order to find the right fix.
关键是你需要了解你的代码试图做什么才能找到正确的修复。
4. Obscure causes
4. 不明原因
Here are a couple of cases where the "Cannot find symbol" is seemingly inexplicable ... until you look closer.
在以下几种情况下,“找不到符号”似乎无法解释……直到您仔细观察。
Incorrect dependencies: If you are using an IDE or a build tool that manages the build path and project dependencies, you may have made a mistake with the dependencies; e.g. left out a dependency, or selected the wrong version. If you are using a build tool (Ant, Maven, Gradle, etc), check the project's build file. If you are using an IDE, check the project's build path configuration.
You are not recompiling: It sometimes happens that new Java programmers don't understand how the Java tool chain works, or haven't implemented a repeatable "build process"; e.g. using an IDE, Ant, Maven, Gradle and so on. In such a situation, the programmer can end up chasing his tail looking for an illusory error that is actuallycaused by not recompiling the code properly, and the like ...
An earlier build problem: It is possible that an earlier build failed in a way that gave a JAR file with missing classes. Such a failure would typically be noticed if you were using a build tool. However if you are getting JAR files from someone else, you are dependent on thembuilding properly, and noticing errors. If you suspect this, use
tar -tvf
to list the contents of the suspect JAR file.IDE issues: People have reported cases where their IDE gets confused and the compiler in the IDE cannot find a class that exists ... or the reverse situation.
This could happen if the IDE has been configured with the wrong JDK version.
This could happen if the IDE's caches get out of sync with the file system. There are IDE specific ways to fix that.
This could be an IDE bug. For instance @Joel Costigliola describes a scenario where Eclipse does not handle a Maven "test" tree correctly: see this answer.
Android issues: When you are programming for Android, and you have "Cannot find symbol" errors related to
R
, be aware that theR
symbols are defined by thecontext.xml
file. Check that yourcontext.xml
file is correct and in the correct place, and that the correspondingR
class file has been generated / compiled. Note that the Java symbols are case sensitive, so the corresponding XML ids are be case sensitive too.Other symbol errors on Android are likely to be due to previously mention reasons; e.g. missing or incorrect dependencies, incorrect package names, method or fields that don't exist in a particular API version, spelling / typing errors, and so on.
Redefining system classes: I've seen cases where the compiler complains that
substring
is an unknown symbol in something like the followingString s = ... String s1 = s.substring(1);
It turned out that the programmer had created their own version of
String
and that his version of the class didn't define asubstring
methods.Lesson: Don't define your own classes with the same names as common library classes!
Homoglyphs:If you use UTF-8 encoding for your source files, it is possible to have identifiers that lookthe same, but are in fact different because they contain homoglyphs. See this pagefor more information.
You can avoid this by restricting yourself to ASCII or Latin-1 as the source file encoding, and using Java
\uxxxx
escapes for other characters.
不正确的依赖项:如果您使用的是管理构建路径和项目依赖项的 IDE 或构建工具,您可能在依赖项方面犯了错误;例如,遗漏了一个依赖项,或选择了错误的版本。如果您使用的是构建工具(Ant、Maven、Gradle 等),请检查项目的构建文件。如果您使用的是 IDE,请检查项目的构建路径配置。
您不是在重新编译:有时会发生这样的情况:新的 Java 程序员不了解 Java 工具链的工作原理,或者没有实现可重复的“构建过程”;例如,使用 IDE、Ant、Maven、Gradle 等。在这种情况下,程序员最终可能会追着他的尾巴寻找实际上是由于没有正确重新编译代码而导致的虚幻错误,等等......
较早的构建问题:较早的构建可能以某种方式失败,导致 JAR 文件缺少类。如果您使用构建工具,通常会注意到这种失败。但是,如果您从其他人那里获取 JAR 文件,则您依赖于它们的正确构建,并注意到错误。如果您怀疑这一点,请使用
tar -tvf
列出可疑 JAR 文件的内容。IDE 问题:人们报告了他们的 IDE 感到困惑并且 IDE 中的编译器找不到存在的类的情况……或者相反的情况。
如果 IDE 配置了错误的 JDK 版本,就会发生这种情况。
如果 IDE 的缓存与文件系统不同步,就会发生这种情况。有 IDE 特定的方法可以解决这个问题。
这可能是 IDE 错误。例如,@Joel Costigliola 描述了 Eclipse 无法正确处理 Maven“测试”树的场景:请参阅此答案。
Android 问题:当您为 Android 编程时,遇到与 相关的“找不到符号”错误
R
,请注意R
符号是由context.xml
文件定义的。检查您的context.xml
文件是否正确并在正确的位置,以及相应的R
类文件是否已生成/编译。请注意,Java 符号区分大小写,因此相应的 XML id 也区分大小写。Android 上的其他符号错误很可能是由于前面提到的原因;例如,缺少或不正确的依赖项、不正确的包名称、特定 API 版本中不存在的方法或字段、拼写/键入错误等。
重新定义系统类:我见过编译器抱怨这
substring
是一个未知符号的情况,如下所示String s = ... String s1 = s.substring(1);
事实证明,程序员创建了他们自己的版本,
String
并且他的类版本没有定义substring
方法。教训:不要使用与公共库类相同的名称定义自己的类!
同形文字:如果您对源文件使用 UTF-8 编码,则可能会有看起来相同但实际上不同的标识符,因为它们包含同形文字。有关更多信息,请参阅此页面。
您可以通过将自己限制为 ASCII 或 Latin-1 作为源文件编码,并对
\uxxxx
其他字符使用 Java转义来避免这种情况。
1 - If, perchance, you dosee this in a runtime exception or error message, then either you have configured your IDE to run code with compilation errors, or your application is generating and compiling code .. at runtime.
1 - 如果您在运行时异常或错误消息中确实看到了这一点,那么要么您已将 IDE 配置为运行带有编译错误的代码,要么您的应用程序正在生成和编译代码 .. 在运行时。
2 - The three basic principles of Civil Engineering: water doesn't flow uphill, a plank is stronger on its side, and you can't push on a string.
2 - 土木工程的三个基本原则:水不会往上流,木板越强,你不能推一根绳子。
回答by thinkterry
You'll also get this error if you forget a new
:
如果您忘记了new
以下内容,您也会收到此错误:
String s = String();
versus
相对
String s = new String();
because the call without the new
keyword will try and look for a (local) method called String
without arguments - and that method signature is likely not defined.
因为不带new
关键字的调用将尝试查找String
不带参数调用的(本地)方法- 并且该方法签名可能未定义。
回答by Jan
One more example of 'Variable is out of scope'
“变量超出范围”的另一个例子
As I've seen that kind of questions a few times already, maybe one more example to what's illegal even if it might feelokay.
正如我已经多次看到这类问题,也许还有一个例子说明什么是非法的,即使感觉还可以。
Consider this code:
考虑这个代码:
if(somethingIsTrue()) {
String message = "Everything is fine";
} else {
String message = "We have an error";
}
System.out.println(message);
That's invalid code. Because neither of the variables named message
is visible outside of their respective scope - which would be the surrounding brackets {}
in this case.
那是无效代码。因为命名的变量都不message
是在其各自范围之外可见 -{}
在这种情况下,这将是周围的括号。
You might say: "But a variable named message is defined either way - so message isdefined after the if
".
你可能会说:“但是一个名为 message 的变量是用任何一种方式定义的——所以 message是在if
“之后定义的”。
But you'd be wrong.
但你错了。
Java has no free()
or delete
operators, so it has to rely on tracking variable scope to find out when variables are no longer used (together with references to these variables of cause).
Java 没有free()
ordelete
运算符,因此它必须依靠跟踪变量作用域来找出何时不再使用变量(以及对这些原因变量的引用)。
It's especially bad if you thought you did something good. I've seen this kind of error after "optimizing" code like this:
如果你认为自己做了一件好事,那就特别糟糕了。我在“优化”这样的代码后看到过这种错误:
if(somethingIsTrue()) {
String message = "Everything is fine";
System.out.println(message);
} else {
String message = "We have an error";
System.out.println(message);
}
"Oh, there's duplicated code, let's pull that common line out" -> and there it it.
“哦,有重复的代码,让我们把那条公共线拉出来”-> 就是这样。
The most common way to deal with this kind of scope-trouble would be to pre-assign the else-values to the variable names in the outside scope and then reassign in if:
处理这种作用域问题的最常见方法是将 else 值预先分配给外部作用域中的变量名称,然后在 if 中重新分配:
String message = "We have an error";
if(somethingIsTrue()) {
message = "Everything is fine";
}
System.out.println(message);
回答by Jonathan Lin
If you're getting this error in the build somewhere else, while your IDE says everything is perfectly fine, then check that you are using the same Java versions in both places.
如果您在其他地方的构建中遇到此错误,而您的 IDE 表示一切正常,请检查您是否在两个地方使用相同的 Java 版本。
For example, Java 7 and Java 8 have different APIs, so calling a non-existent API in an older Java version would cause this error.
例如,Java 7 和 Java 8 具有不同的 API,因此调用旧 Java 版本中不存在的 API 会导致此错误。
回答by Joel Costigliola
One way to get this error in Eclipse :
在 Eclipse 中获取此错误的一种方法:
- Define a class
A
insrc/test/java
. - Define another class
B
insrc/main/java
that uses classA
.
- 定义一个类
A
在src/test/java
。 - 定义另一个类
B
中src/main/java
使用类A
。
Result : Eclipse will compile the code, but maven will give "Cannot find symbol".
结果:Eclipse 将编译代码,但 maven 会给出“找不到符号”。
Underlying cause : Eclipse is using a combined build path for the main and test trees. Unfortunately, it does not support using different build paths for different parts of an Eclipse project, which is what Maven requires.
根本原因:Eclipse 对主树和测试树使用组合构建路径。不幸的是,它不支持对 Eclipse 项目的不同部分使用不同的构建路径,而这正是 Maven 所要求的。
Solution :
解决方案 :
- Don't define your dependencies that way; i.e. don't make this mistake.
- Regularly build your codebase using Maven so that you pick up this mistake early. One way to do that is to use a CI server.
- 不要那样定义你的依赖;即不要犯这个错误。
- 定期使用 Maven 构建您的代码库,以便您及早发现此错误。一种方法是使用 CI 服务器。
回答by Divya Jose
I too was getting this error. (for which I googled and I was directed to this page)
我也收到了这个错误。(为此我用谷歌搜索并被定向到此页面)
Problem:I was calling a static method defined in the class of a project A from a class defined in another project B. I was getting the following error:
问题:我从另一个项目 B 中定义的类调用在项目 A 的类中定义的静态方法。我收到以下错误:
error: cannot find symbol
Solution:I resolved this by first building the project where the method is defined then the project where the method was being called from.
解决方案:我通过首先构建定义方法的项目然后构建调用方法的项目来解决这个问题。
回答by Striker
For hints, look closer at the class name name that throws an error and the line number, example: Compilation failure [ERROR] \applications\xxxxx.java:[44,30] error: cannot find symbol
有关提示,请仔细查看引发错误的类名名称和行号,例如:编译失败 [ERROR] \applications\xxxxx.java:[44,30] 错误:找不到符号
One other cause is unsupported method of for java version say jdk7 vs 8. Check your %JAVA_HOME%
另一个原因是 java 版本不支持的方法说 jdk7 vs 8。检查你的 %JAVA_HOME%
回答by GT_hash
"Can not find " means that , compiler who can't find appropriate variable, method ,class etc...if you got that error massage , first of all you want to find code line where get error massage..And then you will able to find which variable , method or class have not define before using it.After confirmation initialize that variable ,method or class can be used for later require...Consider the following example.
“找不到”意味着,编译器找不到合适的变量、方法、类等......如果你得到那个错误消息,首先你想找到得到错误消息的代码行......然后你会能够找到在使用之前没有定义的变量、方法或类。确认后初始化该变量、方法或类可以用于以后的要求......考虑以下示例。
I'll create a demo class and print a name...
我将创建一个演示类并打印一个名称...
class demo{
public static void main(String a[]){
System.out.print(name);
}
}
Now look at the result..
现在看看结果。。
That error says, "variable name can not find"..Defining and initializing value for 'name' variable can be abolished that error..Actually like this,
那个错误说,“找不到变量名”..定义和初始化'name'变量的值可以消除那个错误..实际上是这样的,
class demo{
public static void main(String a[]){
String name="smith";
System.out.print(name);
}
}
Now look at the new output...
现在看看新的输出...
Ok Successfully solved that error..At the same time , if you could get "can not find method " or "can not find class" something , At first,define a class or method and after use that..
好的 成功解决了那个错误..同时,如果你能得到“找不到方法”或“找不到类”的东西,首先,定义一个类或方法,然后使用它..
回答by avp
There can be various scenarios as people have mentioned above. A couple of things which have helped me resolve this.
正如人们上面提到的,可能存在各种情况。有几件事帮助我解决了这个问题。
If you are using IntelliJ
File -> 'Invalidate Caches/Restart'
如果您使用的是 IntelliJ
File -> 'Invalidate Caches/Restart'
OR
或者
The class being referenced was in another project and that dependency was not added to the Gradle build file of my project. So I added the dependency using
compile project(':anotherProject')
被引用的类在另一个项目中,并且该依赖项没有添加到我项目的 Gradle 构建文件中。所以我添加了依赖使用
compile project(':anotherProject')
and it worked. HTH!
它奏效了。哼!
回答by UdayKiran Pulipati
If eclipse Java build path is mapped to 7, 8 and in Project pom.xml Maven properties java.version is mentioned higher Java version(9,10,11, etc..,) than 7,8 you need to update in pom.xml file.
如果 eclipse Java 构建路径映射到 7, 8 并且在项目 pom.xml Maven 属性中提到 java.version 比 7,8 更高的 Java 版本(9,10,11,等等),您需要在 pom 中更新。 .xml 文件。
In Eclipse if Java is mapped to Java version 11 and in pom.xml it is mapped to Java version 8. Update Eclipse support to Java 11 by go through below steps in eclipse IDE Help -> Install New Software ->
在 Eclipse 中,如果 Java 映射到 Java 版本 11 并且在 pom.xml 中它映射到 Java 版本 8。通过在 Eclipse IDE 帮助 -> 安装新软件 -> 中执行以下步骤,将 Eclipse 支持更新为 Java 11
Paste following link http://download.eclipse.org/eclipse/updates/4.9-P-buildsat Work With
粘贴以下链接http://download.eclipse.org/eclipse/updates/4.9-P-buildsat Work With
or
或者
Add (Popup window will open) ->
添加(弹出窗口将打开)->
Name:
Java 11 support
Location:
http://download.eclipse.org/eclipse/updates/4.9-P-builds
Name:
Java 11 支持
Location:
http://download.eclipse.org/eclipse/updates/4.9-P-builds
then update Java version in Maven properties of pom.xmlfile as below
然后在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>
Finally do right click on project Debug as -> Maven clean, Maven build steps
最后右键单击项目 Debug as -> Maven clean, Maven build steps