"기호를 찾을 수 없음", "기호를 확인할 수 없음" 또는 "기호를 찾을 수 없음" 오류(Java)에 대해 다음을 설명하세요.
이 질문의 목적은 Java에서 흔히 발생하는 컴파일 오류에 대한 포괄적인 Q&A를 제공하는 것입니다.
P粉2037924682023-10-10 12:40:19
잊어버리면 new
다음 오류도 발생합니다:
비교
으아아아 new
关键字的调用将尝试查找不带参数的名为 String
키워드 없이 호출하면 매개 변수를 사용하지 않는 String
이라는 (네이티브) 메서드를 찾으려고 하기 때문에 해당 메서드 서명이 정의되지 않을 수 있습니다. p>
P粉9464374742023-10-10 11:07:06
사실이 아닙니다. "기호를 찾을 수 없음", "기호를 확인할 수 없음" 및 "기호를 찾을 수 없음"은 모두 같은 의미입니다. (다른 Java 컴파일러는 다른 사람들에 의해 작성되며, 다른 사람들은 같은 말을 하기 위해 다른 표현을 사용합니다.)
우선 컴파일 오류1입니다. 이는 Java 소스 코드에 문제가 있거나 또는 컴파일 방식에 문제가 있음을 의미합니다.
Java 소스 코드에는 다음이 포함되어 있습니다.
class
、while
등. true
、false
、42
、'X'
和 “嗨妈妈!”
등. +
、=
、{
등 Reader
、i
、toString
、processEquibalancedElephants
등. "기호를 찾을 수 없음" 오류는 식별자와 관련이 있습니다. 코드를 컴파일할 때 컴파일러는 코드에 있는 각 식별자의 의미를 파악해야 합니다.
"기호를 찾을 수 없음" 오류는 컴파일러가 이 작업을 수행할 수 없음을 의미합니다. 귀하의 코드는 컴파일러가 이해하지 못하는 내용을 참조하고 있는 것 같습니다.
첫번째 주문인 만큼 이유는 딱 하나입니다. 컴파일러는 식별자가 정의되어야 하는 모든 곳을 찾았지만 정의를 찾을 수 없습니다. 이는 다양한 이유로 인해 발생할 수 있습니다. 일반적인 것에는 다음이 포함됩니다:
일반 식별자의 경우:
StringBiulder
而不是 StringBuilder
stringBuilder
而不是 StringBuilder
밑줄을 잘못 사용했을 수도 있습니다. 즉, mystring
和 my_string
아마도 당신은 "다른 곳"으로 선언된 것을 사용하려고 할 것입니다. 즉, 컴파일러에게 보도록 암시적으로 지시한 것과 다른 컨텍스트에서 사용하려고 할 것입니다. (다른 클래스? 다른 범위? 다른 패키지? 다른 코드베이스?) 변수 선언을 잊었을 수도 있습니다.
2"rope".push()
).
메서드를 필드로 사용하려고 하거나 그 반대로 사용하려고 할 수도 있습니다. "rope".length
或 someArray.length()
으아아아
new
package
팁: 포장을 푸세요. 하나의 클래스 또는 하나 이상의 Java 소스 파일로 구성된 간단한 애플리케이션에만 기본 패키지를 사용해야 합니다.
사용하려는 유형을
java.awt.List
而不是 java.util.List
java.io.*
,然后尝试使用 Files
类...它位于 java.nio代码>而不是
java.io
。或者,也许您打算编写 File
...,它是 java.io
다음 예에서는 잘못된 변수 범위 지정으로 인해 "기호를 찾을 수 없음" 오류가 발생할 수 있는 방법을 보여줍니다.
if
문의 i
에 대해 "기호를 찾을 수 없음" 오류가 발생합니다. 앞서 i
를 선언했지만 해당 선언은 for
문과 본문 scope
일 뿐입니다.if
문에서 i
에 대한 참조 는 i
선언을 볼 수 if
语句中为 i
提供“找不到符号”错误。尽管我们之前声明了 i
,但该声明仅for
语句及其主体范围。 if
语句中对 i
的引用看不到 i
않습니다. 범위 밖입니다.
(여기서 적절한 수정은 if
语句移至循环内部,或在循环开始之前声明 i
일 수 있습니다.)
다음은 오타로 인해 설명할 수 없는 것처럼 보이는 "기호를 찾을 수 없음" 오류가 발생하는 혼란스러운 예입니다.
으아아아이것은 println
调用中给您一个编译错误,指出无法找到 i
에 있을 것입니다. 하지만 (당신이 말하는 것을 들었습니다) 나는 그것을 발표했습니다!
문제는 {
之前的分号 ( ;
)。 Java 语言语法将该上下文中的分号定义为空语句。然后,空语句将成为 for
루프의 몸체입니다. 따라서 이 코드는 실제로 다음을 의미합니다.
{ ... }
块不是 for
循环的主体,因此之前在 i
中的声明code>for 문 은 블록의 범위 를 벗어났습니다.
이것은 오타로 인해 발생한 "기호를 찾을 수 없음" 오류의 또 다른 예입니다.
으아악이전 선언에도 불구하고 tmp(...)
表达式中的 tmp
是错误的。编译器将查找名为 tmp
的方法,但找不到。之前声明的 tmp
는 메서드의 네임스페이스가 아닌 변수의 네임스페이스에 있습니다.
제가 본 예에서는 프로그래머가 실제로 연산자를 생략했습니다. 그가 원래 쓰고 싶었던 내용은 다음과 같습니다:
으아악명령줄에서 컴파일하는 경우 컴파일러가 기호를 찾지 못하는 또 다른 이유가 있습니다. 아마도 다른 클래스를 컴파일하거나 다시 컴파일하는 것을 잊어버렸을 것입니다. 예를 들어 수업이 있는 경우 Foo
和 Bar
,其中 Foo
使用 Bar
。如果您从未编译过 Bar
并且运行 javac Foo.java
,您很容易发现编译器找不到符号 Bar
。简单的答案是将 Foo
和 Bar
一起编译;例如javac Foo.java Bar.java
或 javac *.java
. 아니면 Ant, Maven, Gradle 등과 같은 Java 빌드 도구를 사용하는 것이 좋습니다.
그 밖에도 좀 더 모호한 이유가 있는데... 이에 대해서는 아래에서 논의하겠습니다.
일반적으로 말하자면, 먼저 컴파일 오류의 원인 을 알아내야 합니다.
그럼 코드에서 무엇을 말해야 할지 생각해 보세요 . 마지막으로, 원하는 것을 달성하기 위해 소스 코드에 어떤 수정이 필요한지 결정합니다.
모든 "수정"이 올바른 것은 아닙니다. 이것을 고려해보세요:
으아악컴파일러가 j
에 대해 "기호를 찾을 수 없음"이라는 메시지를 표시한다고 가정합니다. 이 문제를 "수정"할 수 있는 방법은 여러 가지가 있습니다.
for
更改为 for (int j = 1; j < 10; j++)
- 아마 맞을 겁니다. for
루프 또는 외부 for
루프 for
循环或外部 for
循环之前添加一个 for j
앞에 for for
循环中将 j
更改为 i
for
루프 내에서 i
로 변경할 수 있습니다. 아마도 틀렸을 것입니다! 요점은 올바른 수정 사항을 찾으려면 코드가 수행하려는 작업을 이해하는 것이
필요 🎜 하다는 것입니다. 🎜다음 몇 가지 경우에는 "기호를 찾을 수 없음"이 의아해 보입니다... 자세히 보기 전까지는 말이죠.
잘못된 종속성: 빌드 경로 및 프로젝트 종속성을 관리하는 IDE 또는 빌드 도구를 사용하는 경우 종속성을 생략하거나 잘못된 버전을 선택하는 등 종속성에 실수가 있을 수 있습니다. 빌드 도구(Ant, Maven, Gradle 등)를 사용하는 경우 프로젝트의 빌드 파일을 확인하세요. IDE를 사용하는 경우 프로젝트의 빌드 경로 구성을 확인하세요.
기호 'var'을 찾을 수 없음: 로컬 변수 유형 추론을 사용하여 컴파일하기 위해 이전 버전을 사용하려고 할 수 있습니다(예: var
声明)的源代码编译器或更旧的 --source
级别。 var
는 Java 10에 도입되었습니다. JDK 버전을 확인하고 파일도 빌드하세요(이런 일이 발생하는 경우) IDE) IDE 설정
컴파일/재컴파일하지 않았습니다: 때로는 새로운 Java 프로그래머가 Java 툴체인의 작동 방식을 이해하지 못하거나 IDE, Ant, Maven, Gradle 등을 사용하여 반복 가능한 "빌드 프로세스"를 구현하지 않는 경우가 있습니다. . 이 경우 프로그래머는 예를 들어 코드를 올바르게 다시 컴파일하지 않아 실제로 발생한 가상 오류를 추적하게 될 수 있습니다.
또 다른 예는 (Java 9+)를 사용하는 경우입니다. java SomeClass.java
编译和运行类时。如果该类依赖于您尚未编译(或重新编译)的另一个类,则您可能会收到涉及第二类的“无法解析符号”错误。其他源文件不会自动编译。 java
명령의 새로운 "컴파일 및 실행" 모드는 여러 소스 코드 파일이 있는 프로그램을 실행하는 데 적합하지 않습니다.
초기 빌드 문제: 초기 빌드가 실패하여 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 버전에 존재하지 않는 메서드 또는 필드, 철자/입력 오류 등 앞서 언급한 이유 때문일 수 있습니다.
Hide System Classes: 컴파일러가 substring
이 알 수 없는 기호라고 불평하는 경우를 본 적이 있습니다.
프로그래머가 자신만의 String
버전을 만들었고 그의 클래스 버전이 String
版本,并且他的类版本没有定义 substring
方法。我见过人们使用 System
、Scanner
메서드를 정의하지 않은 것으로 나타났습니다. 저는 사람들이 이 작업을 수행하기 위해 System
, Scanner
및 기타 클래스를 사용하는 것을 보았습니다.
강의: 공공 도서관 수업과 같은 이름으로 자신의 수업을 정의하지 마세요!
이 문제는 정규화된 이름을 사용하여 해결할 수도 있습니다. 예를 들어, 위의 예에서 프로그래머는 다음과 같이 쓸 수 있습니다:
으아악동형문자: 소스 파일에 UTF-8 인코딩을 사용하면 동일하게 보이지만 동형문자가 포함되어 있기 때문에 실제로는 다른 식별자가 생길 수 있습니다. 자세한 내용은 이 페이지를 참조하세요.
소스 파일 인코딩을 ASCII 또는 Latin-1로 제한하고 Java uxxxx
를 사용하여 다른 문자를 이스케이프하면 이를 방지할 수 있습니다.
1 - 런타임 예외 또는 오류 메시지에서 이 내용이 보이는 경우, 컴파일 오류가 있는 코드를 실행하도록 IDE를 구성했거나 애플리케이션이 런타임 코드에서 빌드 및 컴파일되고 있는 것입니다.
2 - 토목공학의 세 가지 기본 원칙: 물이 더 높은 곳으로 흐르지 않고, 판자가 앞쪽을 향할수록 더 강하고,
줄을 밀 수 없다.