찾다

 >  Q&A  >  본문

"기호를 찾을 수 없음" 또는 "기호를 확인할 수 없음" 오류는 무엇을 의미합니까?

"기호를 찾을 수 없음", "기호를 확인할 수 없음" 또는 "기호를 찾을 수 없음" 오류(Java)에 대해 다음을 설명하세요.

이 질문의 목적은 Java에서 흔히 발생하는 컴파일 오류에 대한 포괄적인 Q&A를 제공하는 것입니다.

P粉106711425P粉106711425441일 전1349

모든 응답(2)나는 대답할 것이다

  • P粉203792468

    P粉2037924682023-10-10 12:40:19

    잊어버리면 new 다음 오류도 발생합니다:

    으아아아

    비교

    으아아아

    new 关键字的调用将尝试查找不带参数的名为 String 키워드 없이 호출하면 매개 변수를 사용하지 않는 String이라는 (네이티브) 메서드를 찾으려고 하기 때문에 해당 메서드 서명이 정의되지 않을 수 있습니다.

    회신하다
    0
  • P粉946437474

    P粉9464374742023-10-10 11:07:06

    0. 이 오류들 사이에 차이점이 있나요?

    사실이 아닙니다. "기호를 찾을 수 없음", "기호를 확인할 수 없음" 및 "기호를 찾을 수 없음"은 모두 같은 의미입니다. (다른 Java 컴파일러는 다른 사람들에 의해 작성되며, 다른 사람들은 같은 말을 하기 위해 다른 표현을 사용합니다.)

    1. "기호를 찾을 수 없음" 오류는 무엇을 의미합니까?

    우선 컴파일 오류1입니다. 이는 Java 소스 코드에 문제가 있거나 또는 컴파일 방식에 문제가 있음을 의미합니다.

    Java 소스 코드에는 다음이 포함되어 있습니다.

    • 키워드: 예를 들어 classwhile 등.
    • 텍스트: truefalse42'X'“嗨妈妈!” 등.
    • 연산자 및 기타 영숫자가 아닌 토큰: 예: +={
    • 식별자: 예를 들어 ReaderitoStringprocessEquibalancedElephants 등.
    • 댓글과 공백.

    "기호를 찾을 수 없음" 오류는 식별자와 관련이 있습니다. 코드를 컴파일할 때 컴파일러는 코드에 있는 각 식별자의 의미를 파악해야 합니다.

    "기호를 찾을 수 없음" 오류는 컴파일러가 이 작업을 수행할 수 없음을 의미합니다. 귀하의 코드는 컴파일러가 이해하지 못하는 내용을 참조하고 있는 것 같습니다.

    2. "기호를 찾을 수 없음" 오류의 원인은 무엇입니까?

    첫번째 주문인 만큼 이유는 딱 하나입니다. 컴파일러는 식별자가 정의되어야 하는 모든 곳을 찾았지만 정의를 찾을 수 없습니다. 이는 다양한 이유로 인해 발생할 수 있습니다. 일반적인 것에는 다음이 포함됩니다:

    • 일반 식별자의 경우:

      • 아마도 귀하의 이름 철자가 잘못되었을 수 있습니다. Java는 철자 오류나 인쇄 오류를 보상할 수 없으며 보상하려고 시도하지 않습니다. StringBiulder 而不是 StringBuilder
      • 아마도 당신이 틀렸을 수도 있습니다. 모든 Java 식별자는 대소문자를 구분합니다.
      • stringBuilder 而不是 StringBuilder밑줄을 잘못 사용했을 수도 있습니다. 즉,
      • 은 다릅니다. (Java 스타일 규칙을 고수한다면 이 실수를 거의 피할 수 있을 것입니다...)
      • mystringmy_string아마도 당신은 "다른 곳"으로 선언된 것을 사용하려고 할 것입니다. 즉, 컴파일러에게 보도록 암시적으로 지시한 것과 다른 컨텍스트에서 사용하려고 할 것입니다. (다른 클래스? 다른 범위? 다른 패키지? 다른 코드베이스?)
    • 변수를 참조해야 하는 식별자의 경우:
    • 변수 선언을 잊었을 수도 있습니다.
      • 변수 선언을 사용하려고 할 때 범위를 벗어났을 수도 있습니다. (아래 예 참조)
    • 메서드 또는 필드 이름이어야 하는 식별자의 경우:
      • 부모/상위 클래스 또는 인터페이스에 선언되지 않은 상속된 메서드나 필드를 참조하려고 할 수 있습니다.
      • 사용 중인 유형에 존재하지 않는(즉, 선언되지 않은) 메서드나 필드를 참조하려고 할 수 있습니다(예:
      • 2"rope".push()).

      • 메서드를 필드로 사용하려고 하거나 그 반대로 사용하려고 할 수도 있습니다. "rope".lengthsomeArray.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는 메서드의 네임스페이스가 아닌 변수의 네임스페이스에 있습니다.

    제가 본 예에서는 프로그래머가 실제로 연산자를 생략했습니다. 그가 원래 쓰고 싶었던 내용은 다음과 같습니다:

    으아악

    명령줄에서 컴파일하는 경우 컴파일러가 기호를 찾지 못하는 또 다른 이유가 있습니다. 아마도 다른 클래스를 컴파일하거나 다시 컴파일하는 것을 잊어버렸을 것입니다. 예를 들어 수업이 있는 경우 FooBar,其中 Foo 使用 Bar。如果您从未编译过 Bar 并且运行 javac Foo.java,您很容易发现编译器找不到符号 Bar 。简单的答案是将 FooBar 一起编译;例如javac Foo.java Bar.javajavac *.java. 아니면 Ant, Maven, Gradle 등과 같은 Java 빌드 도구를 사용하는 것이 좋습니다.

    그 밖에도 좀 더 모호한 이유가 있는데... 이에 대해서는 아래에서 논의하겠습니다.

    3. 이러한 오류를 수정하는 방법은 무엇입니까?

    일반적으로 말하자면, 먼저 컴파일 오류의 원인 을 알아내야 합니다.

    • 컴파일 오류 메시지가 표시된 파일의 줄을 살펴보세요.
    • 오류 메시지가 말하는 기호가 무엇인지 확인하세요.
    • 찾아보세요 이유 컴파일러에서 기호를 찾을 수 없다고 말합니다. 위를 참조하세요.

    그럼 코드에서 무엇을 말해야 할지 생각해 보세요 . 마지막으로, 원하는 것을 달성하기 위해 소스 코드에 어떤 수정이 필요한지 결정합니다.

    모든 "수정"이 올바른 것은 아닙니다. 이것을 고려해보세요:

    으아악

    컴파일러가 j에 대해 "기호를 찾을 수 없음"이라는 메시지를 표시한다고 가정합니다. 이 문제를 "수정"할 수 있는 방법은 여러 가지가 있습니다.

    • 내부를 넣을 수도 있겠네요for 更改为 for (int j = 1; j < 10; j++) - 아마 맞을 겁니다.
    • 내부 for 루프 또는 외부 for 루프 for 循环或外部 for 循环之前添加一个 for j 앞에 for
    • 을 추가할 수 있습니다. 이것이 맞을 수도 있습니다. for 循环中将 j 更改为 i
    • 내부 for 루프 내에서
    • i로 변경할 수 있습니다. 아마도 틀렸을 것입니다!
    잠깐.

    요점은 올바른 수정 사항을 찾으려면 코드가 수행하려는 작업을 이해하는 것이

    필요 🎜 하다는 것입니다. 🎜

    4. 알 수 없는 이유

    다음 몇 가지 경우에는 "기호를 찾을 수 없음"이 의아해 보입니다... 자세히 보기 전까지는 말이죠.

    1. 잘못된 종속성: 빌드 경로 및 프로젝트 종속성을 관리하는 IDE 또는 빌드 도구를 사용하는 경우 종속성을 생략하거나 잘못된 버전을 선택하는 등 종속성에 실수가 있을 수 있습니다. 빌드 도구(Ant, Maven, Gradle 등)를 사용하는 경우 프로젝트의 빌드 파일을 확인하세요. IDE를 사용하는 경우 프로젝트의 빌드 경로 구성을 확인하세요.

    2. 기호 'var'을 찾을 수 없음: 로컬 변수 유형 추론을 사용하여 컴파일하기 위해 이전 버전을 사용하려고 할 수 있습니다(예: var 声明)的源代码编译器或更旧的 --source 级别。 var는 Java 10에 도입되었습니다. JDK 버전을 확인하고 파일도 빌드하세요(이런 일이 발생하는 경우) IDE) IDE 설정

      .
    3. 컴파일/재컴파일하지 않았습니다: 때로는 새로운 Java 프로그래머가 Java 툴체인의 작동 방식을 이해하지 못하거나 IDE, Ant, Maven, Gradle 등을 사용하여 반복 가능한 "빌드 프로세스"를 구현하지 않는 경우가 있습니다. . 이 경우 프로그래머는 예를 들어 코드를 올바르게 다시 컴파일하지 않아 실제로 발생한 가상 오류를 추적하게 될 수 있습니다.

      또 다른 예는 (Java 9+)를 사용하는 경우입니다. java SomeClass.java 编译和运行类时。如果该类依赖于您尚未编译(或重新编译)的另一个类,则您可能会收到涉及第二类的“无法解析符号”错误。其他源文件不会自动编译。 java 명령의 새로운 "컴파일 및 실행" 모드는 여러 소스 코드 파일이 있는 프로그램을 실행하는 데 적합하지 않습니다.

    4. 초기 빌드 문제: 초기 빌드가 실패하여 JAR 파일에 클래스가 누락될 수 있습니다. 빌드 도구를 사용하는 경우 일반적으로 이러한 실패를 발견하게 됩니다. 그러나 다른 사람으로부터 JAR ​​파일을 얻은 경우 해당 파일이 올바르게 빌드되고 오류가 발견될 수 있습니다. 이것이 의심된다면 tar -tvf를 사용하여 의심되는 JAR 파일의 내용을 나열하십시오.

    5. IDE 문제: 사람들은 IDE가 혼란스러워지고 IDE의 컴파일러가 존재하는 클래스를 찾을 수 없거나 그 반대의 상황을 보고했습니다.

      • IDE가 잘못된 JDK 버전으로 구성된 경우 이런 일이 발생할 수 있습니다.

      • 이런 일은 IDE의 캐시가 파일 시스템과 동기화되지 않은 경우 발생할 수 있습니다. 이 문제를 해결하는 몇 가지 IDE 관련 방법이 있습니다.

      • 이것은 IDE 버그일 수 있습니다. 예를 들어 @Joel Costigliola는 Eclipse가 Maven "테스트" 트리를 올바르게 처리하지 못하는 시나리오를 설명합니다. 이 답변 보기 . (분명히 이 특정 버그는 오래 전에 수정되었습니다.)

    6. Android 문제: Android용으로 프로그래밍할 때 R 相关的“找不到符号”错误,请注意 R 符号由 context.xml 文件定义。检查您的 context.xml 文件是否正确且位于正确的位置,以及是否已生成/编译相应的 R. Java 기호는 대소문자를 구분하므로 해당 XML ID도 대소문자를 구분합니다.

      Android의 기타 기호 오류는 누락되거나 잘못된 종속성, 잘못된 패키지 이름, 특정 API 버전에 존재하지 않는 메서드 또는 필드, 철자/입력 오류 등 앞서 언급한 이유 때문일 수 있습니다.

    7. Hide System Classes: 컴파일러가 substring이 알 수 없는 기호라고 불평하는 경우를 본 적이 있습니다.

      으아악

      프로그래머가 자신만의 String 버전을 만들었고 그의 클래스 버전이 String 版本,并且他的类版本没有定义 substring 方法。我见过人们使用 SystemScanner 메서드를 정의하지 않은 것으로 나타났습니다. 저는 사람들이 이 작업을 수행하기 위해 System, Scanner 및 기타 클래스를 사용하는 것을 보았습니다.

      강의: 공공 도서관 수업과 같은 이름으로 자신의 수업을 정의하지 마세요!

      이 문제는 정규화된 이름을 사용하여 해결할 수도 있습니다. 예를 들어, 위의 예에서 프로그래머는 다음과 같이 쓸 수 있습니다:

      으아악
    8. 동형문자: 소스 파일에 UTF-8 인코딩을 사용하면 동일하게 보이지만 동형문자가 포함되어 있기 때문에 실제로는 다른 식별자가 생길 수 있습니다. 자세한 내용은 이 페이지를 참조하세요.

      소스 파일 인코딩을 ASCII 또는 Latin-1로 제한하고 Java uxxxx를 사용하여 다른 문자를 이스케이프하면 이를 방지할 수 있습니다.


    1 - 런타임 예외 또는 오류 메시지에서 이 내용이 보이는 경우, 컴파일 오류가 있는 코드를 실행하도록 IDE를 구성했거나 애플리케이션이 런타임 코드에서 빌드 및 컴파일되고 있는 것입니다. 2 - 토목공학의 세 가지 기본 원칙: 물이 더 높은 곳으로 흐르지 않고, 판자가 앞쪽을 향할수록 더 강하고,
    줄을 밀 수 없다.

    회신하다
    0
  • 취소회신하다