사실이 아닙니다. "기호를 찾을 수 없음", "기호를 확인할 수 없음" 및 "기호를 찾을 수 없음"은 모두 같은 의미입니다. (다른 Java 컴파일러는 다른 사람들에 의해 작성되며, 다른 사람들은 같은 말을 하기 위해 다른 표현을 사용합니다.)
1. "기호를 찾을 수 없음" 오류는 무엇을 의미합니까?
우선 컴파일 오류1입니다. 이는 Java 소스 코드에 문제가 있거나 또는 컴파일 방식에 문제가 있음을 의미합니다.
Java 소스 코드에는 다음이 포함되어 있습니다.
키워드: 예를 들어 class、while 등.
텍스트: true、false、42、'X' 和 “嗨妈妈!” 등.
연산자 및 기타 영숫자가 아닌 토큰: 예: +、=、{ 등
식별자: 예를 들어 Reader、i、toString、processEquibalancedElephants 등.
댓글과 공백.
"기호를 찾을 수 없음" 오류는 식별자와 관련이 있습니다. 코드를 컴파일할 때 컴파일러는 코드에 있는 각 식별자의 의미를 파악해야 합니다.
"기호를 찾을 수 없음" 오류는 컴파일러가 이 작업을 수행할 수 없음을 의미합니다. 귀하의 코드는 컴파일러가 이해하지 못하는 내용을 참조하고 있는 것 같습니다.
2. "기호를 찾을 수 없음" 오류의 원인은 무엇입니까?
첫번째 주문인 만큼 이유는 딱 하나입니다. 컴파일러는 식별자가 정의되어야 하는 모든 곳을 찾았지만 정의를 찾을 수 없습니다. 이는 다양한 이유로 인해 발생할 수 있습니다. 일반적인 것에는 다음이 포함됩니다:
일반 식별자의 경우:
아마도 귀하의 이름 철자가 잘못되었을 수 있습니다. Java는 철자 오류나 인쇄 오류를 보상할 수 없으며 보상하려고 시도하지 않습니다. StringBiulder 而不是 StringBuilder
아마도 당신이 틀렸을 수도 있습니다. 모든 Java 식별자는 대소문자를 구분합니다.
stringBuilder 而不是 StringBuilder밑줄을 잘못 사용했을 수도 있습니다. 즉,
은 다릅니다. (Java 스타일 규칙을 고수한다면 이 실수를 거의 피할 수 있을 것입니다...)
mystring 和 my_string아마도 당신은 "다른 곳"으로 선언된 것을 사용하려고 할 것입니다. 즉, 컴파일러에게 보도록 암시적으로 지시한 것과 다른 컨텍스트에서 사용하려고 할 것입니다. (다른 클래스? 다른 범위? 다른 패키지? 다른 코드베이스?)
변수를 참조해야 하는 식별자의 경우:
변수 선언을 잊었을 수도 있습니다.
변수 선언을 사용하려고 할 때 범위를 벗어났을 수도 있습니다. (아래 예 참조)
메서드 또는 필드 이름이어야 하는 식별자의 경우:
부모/상위 클래스 또는 인터페이스에 선언되지 않은 상속된 메서드나 필드를 참조하려고 할 수 있습니다.
사용 중인 유형에 존재하지 않는(즉, 선언되지 않은) 메서드나 필드를 참조하려고 할 수 있습니다(예:
2"rope".push()).
메서드를 필드로 사용하려고 하거나 그 반대로 사용하려고 할 수도 있습니다. "rope".length 或 someArray.length()
예를 들어 배열 요소 대신 배열을 실수로 조작했을 수도 있습니다.
으아아아
클래스 이름이어야 하는 식별자의 경우:
클래스를 가져오는 것을 잊었을 수도 있습니다.
"별표" 가져오기를 사용했지만 가져온 패키지에 클래스가 정의되어 있지 않을 수 있습니다.
다음과 같은
하나를 잊어버렸을 수도 있습니다.
으아아아
new
기본 패키지에 이미 선언된 클래스를 가져오거나 사용하려고 할 수 있습니다. 즉,
문이 없는 클래스가 있는 경우입니다.
package팁: 포장을 푸세요. 하나의 클래스 또는 하나 이상의 Java 소스 파일로 구성된 간단한 애플리케이션에만 기본 패키지를 사용해야 합니다.
유형이나 인스턴스에 예상한 멤버(메서드나 필드 등)가 없는 것 같은 경우:
사용하려는 유형을
숨기면서
중첩 클래스나 일반 매개변수를 선언했을 수도 있습니다. 정적 변수나 인스턴스 변수를 숨기고 있을 수도 있습니다.
예를 들어 IDE 완성 또는 자동 수정이 제안될 수 있기 때문에 잘못된 유형을 가져왔을 수 있습니다.
아마도 잘못된 버전의 API를 사용(컴파일)하고 있는 것 같습니다. 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 빌드 도구를 사용하는 것이 좋습니다.
그 밖에도 좀 더 모호한 이유가 있는데... 이에 대해서는 아래에서 논의하겠습니다.
3. 이러한 오류를 수정하는 방법은 무엇입니까?
일반적으로 말하자면, 먼저 컴파일 오류의 원인 을 알아내야 합니다.
컴파일 오류 메시지가 표시된 파일의 줄을 살펴보세요.
오류 메시지가 말하는 기호가 무엇인지 확인하세요.
찾아보세요 이유 컴파일러에서 기호를 찾을 수 없다고 말합니다. 위를 참조하세요.
그럼 코드에서 무엇을 말해야 할지 생각해 보세요 . 마지막으로, 원하는 것을 달성하기 위해 소스 코드에 어떤 수정이 필요한지 결정합니다.
모든 "수정"이 올바른 것은 아닙니다. 이것을 고려해보세요:
으아악
컴파일러가 j에 대해 "기호를 찾을 수 없음"이라는 메시지를 표시한다고 가정합니다. 이 문제를 "수정"할 수 있는 방법은 여러 가지가 있습니다.
내부를 넣을 수도 있겠네요for 更改为 for (int j = 1; j - 아마 맞을 겁니다.
내부 for 루프 또는 외부 for 루프 for 循环或外部 for 循环之前添加一个 for j 앞에 for
문
을 추가할 수 있습니다. 이것이 맞을 수도 있습니다. for 循环中将 j 更改为 i
내부 for 루프 내에서
를 i로 변경할 수 있습니다. 아마도 틀렸을 것입니다!
잠깐.
요점은 올바른 수정 사항을 찾으려면 코드가 수행하려는 작업을 이해하는 것이
필요 🎜 하다는 것입니다. 🎜
4. 알 수 없는 이유
다음 몇 가지 경우에는 "기호를 찾을 수 없음"이 의아해 보입니다... 자세히 보기 전까지는 말이죠.
잘못된 종속성: 빌드 경로 및 프로젝트 종속성을 관리하는 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 - 토목공학의 세 가지 기본 원칙: 물이 더 높은 곳으로 흐르지 않고, 판자가 앞쪽을 향할수록 더 강하고, 줄을 밀 수 없다.
잊어버리면
으아아아new
다음 오류도 발생합니다:비교
으아아아new
关键字的调用将尝试查找不带参数的名为String
키워드 없이 호출하면 매개 변수를 사용하지 않는String
이라는 (네이티브) 메서드를 찾으려고 하기 때문에 해당 메서드 서명이 정의되지 않을 수 있습니다. p>0. 이 오류들 사이에 차이점이 있나요?
사실이 아닙니다. "기호를 찾을 수 없음", "기호를 확인할 수 없음" 및 "기호를 찾을 수 없음"은 모두 같은 의미입니다. (다른 Java 컴파일러는 다른 사람들에 의해 작성되며, 다른 사람들은 같은 말을 하기 위해 다른 표현을 사용합니다.)
1. "기호를 찾을 수 없음" 오류는 무엇을 의미합니까?
우선 컴파일 오류1입니다. 이는 Java 소스 코드에 문제가 있거나 또는 컴파일 방식에 문제가 있음을 의미합니다.
Java 소스 코드에는 다음이 포함되어 있습니다.
class
、while
등.true
、false
、42
、'X'
和“嗨妈妈!”
등.+
、=
、{
등Reader
、i
、toString
、processEquibalancedElephants
등."기호를 찾을 수 없음" 오류는 식별자와 관련이 있습니다. 코드를 컴파일할 때 컴파일러는 코드에 있는 각 식별자의 의미를 파악해야 합니다.
"기호를 찾을 수 없음" 오류는 컴파일러가 이 작업을 수행할 수 없음을 의미합니다. 귀하의 코드는 컴파일러가 이해하지 못하는 내용을 참조하고 있는 것 같습니다.
2. "기호를 찾을 수 없음" 오류의 원인은 무엇입니까?
첫번째 주문인 만큼 이유는 딱 하나입니다. 컴파일러는 식별자가 정의되어야 하는 모든 곳을 찾았지만 정의를 찾을 수 없습니다. 이는 다양한 이유로 인해 발생할 수 있습니다. 일반적인 것에는 다음이 포함됩니다:
일반 식별자의 경우:
StringBiulder
而不是StringBuilder
stringBuilder
而不是StringBuilder
밑줄을 잘못 사용했을 수도 있습니다. 즉,mystring
和my_string
아마도 당신은 "다른 곳"으로 선언된 것을 사용하려고 할 것입니다. 즉, 컴파일러에게 보도록 암시적으로 지시한 것과 다른 컨텍스트에서 사용하려고 할 것입니다. (다른 클래스? 다른 범위? 다른 패키지? 다른 코드베이스?)부모/상위 클래스 또는 인터페이스에 선언되지 않은 상속된 메서드나 필드를 참조하려고 할 수 있습니다.-
사용 중인 유형에 존재하지 않는(즉, 선언되지 않은) 메서드나 필드를 참조하려고 할 수 있습니다(예:
-
- 예를 들어 배열 요소 대신 배열을 실수로 조작했을 수도 있습니다.
으아아아
2
"rope".push()
).메서드를 필드로 사용하려고 하거나 그 반대로 사용하려고 할 수도 있습니다.
"rope".length
或someArray.length()
클래스를 가져오는 것을 잊었을 수도 있습니다.-
"별표" 가져오기를 사용했지만 가져온 패키지에 클래스가 정의되어 있지 않을 수 있습니다. -
다음과 같은 - 하나를 잊어버렸을 수도 있습니다.
기본 패키지에 이미 선언된 클래스를 가져오거나 사용하려고 할 수 있습니다. 즉, - 문이 없는 클래스가 있는 경우입니다.
으아아아
new
package
팁: 포장을 푸세요. 하나의 클래스 또는 하나 이상의 Java 소스 파일로 구성된 간단한 애플리케이션에만 기본 패키지를 사용해야 합니다.숨기면서- 중첩 클래스나 일반 매개변수를 선언했을 수도 있습니다.
정적 변수나 인스턴스 변수를 숨기고 있을 수도 있습니다.
- 예를 들어 IDE 완성 또는 자동 수정이 제안될 수 있기 때문에 잘못된 유형을 가져왔을 수 있습니다.
- 아마도 잘못된 버전의 API를 사용(컴파일)하고 있는 것 같습니다.
객체를 적절한 하위 클래스로 캐스팅하는 것을 잊었을 수도 있습니다. -
아마도 - 변수의 유형
을 찾고 있는 멤버의 상위 유형으로 선언했을 것입니다. -
질문은 대개 위의 질문을 조합한 것입니다. 예를 들어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 빌드 도구를 사용하는 것이 좋습니다.그 밖에도 좀 더 모호한 이유가 있는데... 이에 대해서는 아래에서 논의하겠습니다.
3. 이러한 오류를 수정하는 방법은 무엇입니까?
일반적으로 말하자면, 먼저 컴파일 오류의 원인 을 알아내야 합니다.
그럼 코드에서 무엇을 말해야 할지 생각해 보세요 . 마지막으로, 원하는 것을 달성하기 위해 소스 코드에 어떤 수정이 필요한지 결정합니다.
모든 "수정"이 올바른 것은 아닙니다. 이것을 고려해보세요:
으아악컴파일러가
j
에 대해 "기호를 찾을 수 없음"이라는 메시지를 표시한다고 가정합니다. 이 문제를 "수정"할 수 있는 방법은 여러 가지가 있습니다.for
更改为for (int j = 1; j - 아마 맞을 겁니다.
for
루프 또는 외부for
루프for
循环或外部for
循环之前添加一个 forj
앞에 forfor
循环中将j
更改为i
for
루프 내에서i
로 변경할 수 있습니다. 아마도 틀렸을 것입니다!요점은 올바른 수정 사항을 찾으려면 코드가 수행하려는 작업을 이해하는 것이
필요 🎜 하다는 것입니다. 🎜4. 알 수 없는 이유
다음 몇 가지 경우에는 "기호를 찾을 수 없음"이 의아해 보입니다... 자세히 보기 전까지는 말이죠.
잘못된 종속성: 빌드 경로 및 프로젝트 종속성을 관리하는 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 - 토목공학의 세 가지 기본 원칙: 물이 더 높은 곳으로 흐르지 않고, 판자가 앞쪽을 향할수록 더 강하고,
줄을 밀 수 없다.