Một biểu tượng không thể tìm thấy biểu tượng nào


395

Vui lòng giải thích các lỗi sau về lỗi "Không thể tìm thấy biểu tượng" và "Không thể giải quyết biểu tượng":

  • Có ý nghĩa gì?
  • Điều gì có thể gây ra chúng?
  • Làm thế nào để lập trình viên sửa chữa chúng?

Câu hỏi này được thiết kế để tạo ra một câu hỏi và trả lời toàn diện về các lỗi biên dịch phổ biến này trong Java.

Câu trả lời:


417

0. Có sự khác biệt nào giữa hai lỗi không?

Không hẳn vậy. "Không thể tìm thấy biểu tượng" và "Không thể giải quyết biểu tượng" có nghĩa tương tự. Một số trình biên dịch Java sử dụng một cụm từ và một số cụm từ khác.

1. Lỗi "Không thể tìm thấy biểu tượng" nghĩa là gì?

Thứ nhất, đó là lỗi biên dịch 1 . Điều đó có nghĩa có một vấn đề trong mã nguồn Java của bạn hoặc có một vấn đề trong cách bạn biên dịch nó.

Mã nguồn Java của bạn bao gồm những điều sau đây:

  • Từ khóa: như true, false, class, while, và vân vân.
  • Literals: như 42'X'"Hi mum!".
  • Các nhà khai thác và thẻ không tự chữ và số khác: như +, =, {, và vân vân.
  • Định danh: như Reader, i, toString, processEquibalancedElephants, và vân vân.
  • Bình luận và khoảng trắng.

Một lỗi "Không thể tìm thấy biểu tượng" là về các định danh. Khi mã của bạn được biên dịch, trình biên dịch cần tìm ra ý nghĩa của mỗi và mọi mã định danh trong mã của bạn.

Một lỗi "Không thể tìm thấy biểu tượng" có nghĩa là trình biên dịch không thể làm điều này. Mã của bạn dường như đề cập đến một cái gì đó mà trình biên dịch không hiểu.

2. Điều gì có thể gây ra lỗi "Không thể tìm thấy biểu tượng"?

Là một đơn đặt hàng đầu tiên, chỉ có một nguyên nhân. Trình biên dịch đã xem xét tất cả các vị trí cần xác định định danh và không thể tìm thấy định nghĩa. Điều này có thể được gây ra bởi một số điều. Những cái phổ biến như sau:

  • Đối với định danh nói chung:
    • Có lẽ bạn đánh vần tên không chính xác; tức là StringBiulderthay vì StringBuilder. Java không thể và sẽ không cố gắng bù cho lỗi chính tả hoặc lỗi đánh máy.
    • Có lẽ bạn đã hiểu sai trường hợp; tức là stringBuilderthay vì StringBuilder. Tất cả các định danh Java đều phân biệt chữ hoa chữ thường.
    • Có lẽ bạn đã sử dụng dấu gạch dưới không phù hợp; tức là mystringmy_stringkhác nhau (Nếu bạn tuân thủ các quy tắc kiểu Java, bạn sẽ được bảo vệ phần lớn khỏi sai lầm này ...)
    • Có lẽ bạn đang cố gắng sử dụng một cái gì đó được tuyên bố là "ở một nơi khác"; tức là trong một bối cảnh khác với nơi mà bạn đã ngầm bảo trình biên dịch tìm. (Một lớp khác nhau? Một phạm vi khác nhau? Một gói khác nhau? Một cơ sở mã khác nhau?)
  • Đối với các định danh nên tham khảo các biến:
    • Có lẽ bạn đã quên khai báo biến.
    • Có lẽ khai báo biến nằm ngoài phạm vi tại điểm bạn đã cố sử dụng nó. (Xem ví dụ bên dưới)
  • Đối với các định danh phải là tên phương thức hoặc trường:

    • Có lẽ bạn đang cố gắng tham khảo một phương thức hoặc trường được kế thừa không được khai báo trong các lớp hoặc giao diện cha mẹ / tổ tiên.
    • Có lẽ bạn đang cố gắng đề cập đến một phương thức hoặc trường không tồn tại (nghĩa là chưa được khai báo) trong loại bạn đang sử dụng; ví dụ "someString".push()2 .
    • Có lẽ bạn đang cố gắng sử dụng một phương thức như một trường hoặc ngược lại; ví dụ "someString".lengthhay someArray.length().
    • Có lẽ bạn đang vận hành nhầm trên một mảng chứ không phải là phần tử mảng; ví dụ

      String strings[] = ...
      if (strings.charAt(3)) { ... }
      // maybe that should be 'strings[0].charAt(3)'
      
  • Đối với các định danh phải là tên lớp:

    • Có lẽ bạn đã quên nhập lớp.
    • Có lẽ bạn đã sử dụng nhập "sao", nhưng lớp không được xác định trong bất kỳ gói nào bạn đã nhập.
    • Có lẽ bạn đã quên một newnhư trong:

      String s = String();  // should be 'new String()'
  • Đối với trường hợp loại hoặc thể hiện không có thành viên bạn mong muốn có:

    • Có lẽ bạn đã khai báo một lớp lồng nhau hoặc một tham số chung làm mờ loại bạn muốn sử dụng.
    • Có lẽ bạn đang theo dõi một biến tĩnh hoặc ví dụ.
    • Có lẽ bạn đã nhập sai loại; ví dụ do hoàn thành IDE hoặc tự động sửa.
    • Có lẽ bạn đang sử dụng (biên dịch lại) phiên bản API sai.
    • Có lẽ bạn đã quên bỏ đối tượng của mình vào một lớp con thích hợp.

Vấn đề thường là sự kết hợp của những điều trên. Ví dụ: có thể bạn "sao" đã nhập java.io.*và sau đó thử sử dụng Fileslớp ... java.niokhông có java.io. Hoặc có lẽ bạn muốn viết File... đó một lớp học java.io.


Dưới đây là một ví dụ về cách phạm vi biến không chính xác có thể dẫn đến lỗi "Không thể tìm thấy biểu tượng":

List<String> strings = ...

for (int i = 0; i < strings.size(); i++) {
    if (strings.get(i).equalsIgnoreCase("fnord")) {
        break;
    }
}
if (i < strings.size()) {
    ...
}

Điều này sẽ đưa ra lỗi "Không thể tìm thấy biểu tượng" itrong ifcâu lệnh. Mặc dù trước đây chúng tôi đã tuyên bố i, tuyên bố đó chỉ nằm trong phạm vi cho fortuyên bố và nội dung của nó. Tham chiếu đến itrong iftuyên bố không thể thấy tuyên bố đó i. Nó nằm ngoài phạm vi .

(Một điều chỉnh thích hợp ở đây có thể là di chuyển ifcâu lệnh bên trong vòng lặp hoặc khai báo itrước khi bắt đầu vòng lặp.)


Dưới đây là một ví dụ gây ra sự khó hiểu khi lỗi chính tả dẫn đến lỗi "Biểu tượng không thể tìm thấy" dường như không thể giải thích được:

for (int i = 0; i < 100; i++); {
    System.out.println("i is " + i);
}

Điều này sẽ cung cấp cho bạn một lỗi biên dịch trong printlncuộc gọi nói rằng ikhông thể tìm thấy. Nhưng (tôi nghe bạn nói) Tôi đã tuyên bố điều đó!

Vấn đề là dấu chấm phẩy lén lút ( ;) trước {. Cú pháp ngôn ngữ Java định nghĩa một dấu chấm phẩy trong ngữ cảnh đó là một câu lệnh trống . Câu lệnh trống sau đó trở thành phần thân của forvòng lặp. Vì vậy, mã thực sự có nghĩa này:

for (int i = 0; i < 100; i++); 

// The previous and following are separate statements!!

{
    System.out.println("i is " + i);
}

Các { ... }khối KHÔNG phải là cơ thể của forvòng lặp, và do đó việc khai báo trước đó của itrong fortuyên bố là ra khỏi phạm vi trong khối.


Dưới đây là một ví dụ khác về lỗi "Không thể tìm thấy biểu tượng" do lỗi chính tả gây ra.

int tmp = ...
int res = tmp(a + b);

Mặc dù tuyên bố trước đó, tmptrong tmp(...)biểu thức là sai lầm. Trình biên dịch sẽ tìm kiếm một phương thức được gọi tmpvà sẽ không tìm thấy một phương thức nào. Khai báo trước đó tmplà trong không gian tên cho các biến, không phải là không gian tên cho các phương thức.

Trong ví dụ tôi đi qua, lập trình viên đã thực sự bỏ qua một toán tử. Những gì ông muốn viết là đây:

int res = tmp * (a + b);

Có một lý do khác khiến trình biên dịch có thể không tìm thấy ký hiệu nếu bạn biên dịch từ dòng lệnh. Bạn có thể chỉ đơn giản là quên biên dịch hoặc biên dịch lại một số lớp khác. Ví dụ, nếu bạn có các lớp FooBarnơi Foosử dụng Bar. Nếu bạn chưa bao giờ biên dịch Barvà bạn chạy javac Foo.java, bạn có thể thấy rằng trình biên dịch không thể tìm thấy biểu tượng Bar. Câu trả lời đơn giản là biên dịch FooBarcùng nhau; ví dụ javac Foo.java Bar.javahay javac *.java. Hoặc tốt hơn là vẫn sử dụng một công cụ xây dựng Java; ví dụ: Ant, Maven, Gradle, v.v.

Có một số nguyên nhân mơ hồ khác nữa ... mà tôi sẽ giải quyết dưới đây.

3. Làm thế nào để tôi sửa những lỗi này?

Nói chung, bạn bắt đầu bằng cách tìm ra nguyên nhân gây ra lỗi biên dịch.

  • Nhìn vào dòng trong tệp được chỉ định bởi thông báo lỗi biên dịch.
  • Xác định biểu tượng mà thông báo lỗi đang nói về.
  • Tìm hiểu tại sao trình biên dịch nói rằng nó không thể tìm thấy biểu tượng; xem ở trên!

Sau đó, bạn nghĩ về những gì mã của bạn được cho là nói. Sau đó, cuối cùng bạn tìm ra cách chỉnh sửa mà bạn cần thực hiện đối với mã nguồn của mình để làm những gì bạn muốn.

Lưu ý rằng không phải mọi "hiệu chỉnh" đều đúng. Xem xét điều này:

for (int i = 1; i < 10; i++) {
    for (j = 1; j < 10; j++) {
        ...
    }
}

Giả sử rằng trình biên dịch nói "Không thể tìm thấy biểu tượng" cho j. Có nhiều cách tôi có thể "sửa" điều đó:

  • Tôi có thể thay đổi bên trong forđể for (int j = 1; j < 10; j++)- có thể chính xác.
  • Tôi có thể thêm một khai báo cho j trướcfor vòng lặp bên trong hoặc forvòng lặp bên ngoài - có thể đúng.
  • Tôi có thể thay đổi jđể itrong khu vực nội forloop - có lẽ sai!
  • và như thế.

Vấn đề là bạn cần hiểu mã của bạn đang cố gắng làm gì để tìm ra cách khắc phục phù hợp.

4. Nguyên nhân tối nghĩa

Dưới đây là một vài trường hợp "Biểu tượng không thể tìm thấy" dường như không thể giải thích được ... cho đến khi bạn nhìn gần hơn.

  1. Phụ thuộc không chính xác : Nếu bạn đang sử dụng IDE hoặc công cụ xây dựng quản lý đường dẫn xây dựng và phụ thuộc dự án, bạn có thể đã mắc lỗi với các phụ thuộc; ví dụ bỏ qua một phụ thuộc hoặc chọn phiên bản sai. Nếu bạn đang sử dụng một công cụ xây dựng (Ant, Maven, Gradle, v.v.), hãy kiểm tra tệp xây dựng của dự án. Nếu bạn đang sử dụng IDE, hãy kiểm tra cấu hình đường dẫn xây dựng của dự án.

  2. Bạn không biên dịch lại : Đôi khi xảy ra việc các lập trình viên Java mới không hiểu cách thức chuỗi công cụ Java hoạt động hoặc không thực hiện "quy trình xây dựng" lặp lại; ví dụ: sử dụng IDE, Ant, Maven, Gradle, v.v. Trong tình huống như vậy, lập trình viên cuối cùng có thể đuổi theo đuôi của mình để tìm kiếm một lỗi ảo tưởng thực sự gây ra do không biên dịch lại mã đúng, và tương tự ...

  3. Một vấn đề xây dựng trước đó : Có thể là một bản dựng trước đó đã thất bại theo cách đưa ra một tệp JAR với các lớp bị thiếu. Một lỗi như vậy thường sẽ được chú ý nếu bạn đang sử dụng một công cụ xây dựng. Tuy nhiên, nếu bạn đang nhận tệp JAR từ người khác, bạn phụ thuộc vào việc họ xây dựng đúng cách và nhận thấy lỗi. Nếu bạn nghi ngờ điều này, hãy sử dụng tar -tvfđể liệt kê nội dung của tệp JAR nghi ngờ.

  4. Các vấn đề về IDE : Mọi người đã báo cáo các trường hợp IDE của họ bị lẫn lộn và trình biên dịch trong IDE không thể tìm thấy một lớp tồn tại ... hoặc tình huống ngược lại.

    • Điều này có thể xảy ra nếu IDE đã được cấu hình với phiên bản JDK sai.

    • Điều này có thể xảy ra nếu bộ nhớ cache của IDE không đồng bộ với hệ thống tệp. Có những cách cụ thể IDE để khắc phục điều đó.

    • Đây có thể là một lỗi IDE. Ví dụ @Joel Costigliola mô tả một kịch bản trong đó Eclipse không xử lý chính xác cây "kiểm tra" Maven: xem câu trả lời này .

  5. Sự cố của Android : Khi bạn đang lập trình cho Android và bạn có các lỗi "Không thể tìm thấy biểu tượng" liên quan đến R, hãy lưu ý rằng các Rbiểu tượng được xác định bởi context.xmltệp. Kiểm tra xem context.xmltệp của bạn có đúng và ở đúng vị trí không, và Rtệp lớp tương ứng đã được tạo / biên dịch chưa. Lưu ý rằng các ký hiệu Java có phân biệt chữ hoa chữ thường, vì vậy các id XML tương ứng cũng phân biệt chữ hoa chữ thường.

    Các lỗi biểu tượng khác trên Android có thể là do các lý do đã đề cập trước đó; ví dụ: phụ thuộc bị thiếu hoặc không chính xác, tên gói, phương thức hoặc trường không chính xác không tồn tại trong một phiên bản API cụ thể, lỗi chính tả / đánh máy, v.v.

  6. Xác định lại các lớp hệ thống : Tôi đã thấy các trường hợp trình biên dịch phàn nàn rằng đó substringlà một biểu tượng không xác định trong một cái gì đó như sau

    String s = ...
    String s1 = s.substring(1);
    

    Hóa ra là lập trình viên đã tạo ra phiên bản của riêng họ Stringvà phiên bản lớp của anh ta không định nghĩa một substringphương thức.

    Bài học: Đừng định nghĩa các lớp của riêng bạn có cùng tên với các lớp thư viện chung!

  7. Homoglyphs: Nếu bạn sử dụng mã hóa UTF-8 cho các tệp nguồn của mình, có thể có các mã định danh trông giống nhau, nhưng thực tế lại khác nhau vì chúng chứa homoglyphs. Xem trang này để biết thêm thông tin.

    Bạn có thể tránh điều này bằng cách giới hạn bản thân ở ASCII hoặc Latin-1 dưới dạng mã hóa tệp nguồn và sử dụng các \uxxxxlối thoát Java cho các ký tự khác.


1 - Nếu tình cờ, bạn làm thấy điều này trong một ngoại lệ thời gian chạy hoặc thông báo lỗi, sau đó hoặc là bạn đã cấu hình IDE của bạn để mã chạy với lỗi biên dịch, hoặc ứng dụng của bạn được tạo ra và biên dịch mã .. khi chạy.

2 - Ba nguyên tắc cơ bản của Kỹ thuật Xây dựng: nước không chảy lên dốc, một tấm ván mạnh hơn về phía nó và bạn không thể đẩy lên một chuỗi .


Tôi đã có một tình huống khác xảy ra lỗi biên dịch này trong khi nhật thực không thấy vấn đề: Hai lớp có phụ thuộc được xác định trong lớp khác tương ứng. Trong trường hợp của tôi, tôi đã có một enum, thực hiện một giao diện, được định nghĩa trong một lớp mà tôi đã dại dột sử dụng enum.
Jogi

Tương tự như nhận xét ở trên, khi tôi biên dịch và chạy chương trình của tôi từ Eclipse, nó không hoạt động. Việc biên dịch nó từ bảng điều khiển làm tăng một loạt các lỗi "Không thể tìm thấy biểu tượng" này thường liên quan đến yếu tố cuối cùng trong quá trình nhập. Tôi không biết điều gì gây ra điều này vì thực sự không có gì sai trong mã.
Andres Stadelmann

Một vấn đề khác là các IDE có thể "diễn giải" các lỗi khác vào danh mục này. Ví dụ printlntrong System.out.printlnnếu đặt ở cấp lớp dưới biên dịch tiêu chuẩn sẽ cung cấp cho chúng tôi <identifier> expected( bản demo ) nhưng trong IntelliJ chúng ta sẽ thấy Cannot resolve symbol 'println'( bản demo ).
Pshemo

Ồ Tôi sẽ gọi đó là một lỗi biên dịch.
Stephen C

23

Bạn cũng sẽ gặp lỗi này nếu bạn quên new:

String s = String();

đấu với

String s = new String();

bởi vì cuộc gọi không có newtừ khóa sẽ thử và tìm kiếm một phương thức (cục bộ) được gọi Stringmà không có đối số - và chữ ký phương thức đó có thể không được xác định.


14

Thêm một ví dụ nữa về 'Biến là ngoài phạm vi'

Như tôi đã thấy loại câu hỏi đó một vài lần rồi, có thể thêm một ví dụ cho những gì bất hợp pháp ngay cả khi nó có thể cảm thấy ổn.

Xem xét mã này:

if(somethingIsTrue()) {
  String message = "Everything is fine";
} else {
  String message = "We have an error";
}
System.out.println(message);

Đó là mã không hợp lệ. Bởi vì không có biến nào được đặt tên messagecó thể nhìn thấy bên ngoài phạm vi tương ứng của chúng - đó sẽ là dấu ngoặc xung quanh {}trong trường hợp này.

Bạn có thể nói: "Nhưng một thông báo có tên biến được định nghĩa theo một trong hai cách - vì vậy tin nhắn được xác định sau if".

Nhưng bạn đã sai.

Java không có free()hoặc deletetoán tử, vì vậy nó phải dựa vào phạm vi theo dõi biến để tìm ra khi nào các biến không còn được sử dụng (cùng với các tham chiếu đến các biến nguyên nhân này).

Điều đó đặc biệt tệ nếu bạn nghĩ bạn đã làm điều gì đó tốt. Tôi đã thấy loại lỗi này sau khi "tối ưu hóa" mã như thế này:

if(somethingIsTrue()) {
  String message = "Everything is fine";
  System.out.println(message);
} else {
  String message = "We have an error";
  System.out.println(message);
}

"Ồ, có mã trùng lặp, hãy rút dòng chung đó ra" -> và ở đó.

Cách phổ biến nhất để xử lý loại rắc rối phạm vi này là gán trước các giá trị khác cho các tên biến trong phạm vi bên ngoài và sau đó gán lại nếu:

String message = "We have an error";
if(somethingIsTrue()) {
  message = "Everything is fine";
} 
System.out.println(message);

4
"Java không có toán tử tự do () hoặc xóa, do đó, nó phải dựa vào phạm vi biến theo dõi để tìm ra khi nào các biến không còn được sử dụng (cùng với các tham chiếu đến các biến nguyên nhân này)." - Trong khi sự thật, điều này không liên quan. C và C ++ có các toán tử miễn phí / xóa tương ứng, và mã C / C ++ tương đương với các ví dụ của bạn sẽ là bất hợp pháp. Các khối C và C ++ giới hạn phạm vi của các biến giống như trong Java. Trong thực tế, điều này đúng với hầu hết các ngôn ngữ "có cấu trúc khối".
Stephen C

1
Giải pháp tốt hơn cho mã gán một giá trị khác nhau trên mỗi nhánh là sử dụng khai báo biến trốngfinal .
Daniel Pryden

10

Một cách để nhận lỗi này trong Eclipse:

  1. Xác định một lớp Atrong src/test/java.
  2. Xác định một lớp khác Btrong src/main/javađó sử dụng lớp A.

Kết quả: Eclipse sẽ biên dịch mã, nhưng maven sẽ đưa ra "Biểu tượng không thể tìm thấy".

Nguyên nhân cơ bản: Eclipse đang sử dụng một đường dẫn xây dựng kết hợp cho các cây chính và cây thử nghiệm. Thật không may, nó không hỗ trợ sử dụng các đường dẫn xây dựng khác nhau cho các phần khác nhau của dự án Eclipse, đó là điều Maven yêu cầu.

Giải pháp :

  1. Đừng xác định sự phụ thuộc của bạn theo cách đó; tức là đừng phạm sai lầm này
  2. Thường xuyên xây dựng cơ sở mã của bạn bằng Maven để bạn sớm nhận ra lỗi này. Một cách để làm điều đó là sử dụng máy chủ CI.

Giải pháp cho vấn đề này là gì?

2
bất cứ điều gì bạn sử dụng trong src / main / java cần phải được xác định trong src / main / java hoặc trong bất kỳ phụ thuộc biên dịch / thời gian chạy nào (không phải phụ thuộc kiểm tra).
Joel Costigliola

5

"Không thể tìm thấy" có nghĩa là, trình biên dịch không thể tìm thấy biến, phương thức, lớp phù hợp, v.v ... nếu bạn bị lỗi đó, trước hết bạn muốn tìm dòng mã nơi nhận được lỗi massage..Và sau đó bạn sẽ có thể tìm thấy biến, phương thức hoặc lớp nào chưa xác định trước khi sử dụng nó. Sau khi xác nhận khởi tạo biến đó, phương thức hoặc lớp có thể được sử dụng cho yêu cầu sau này ... Hãy xem xét ví dụ sau.

Tôi sẽ tạo một lớp demo và in tên ...

class demo{ 
      public static void main(String a[]){
             System.out.print(name);
      }
}

Bây giờ hãy nhìn vào kết quả ..

nhập mô tả hình ảnh ở đây

Lỗi đó cho biết, "tên biến không thể tìm thấy" .. Xác định và khởi tạo giá trị cho biến 'name' có thể được xóa bỏ lỗi đó..Thực tế như thế này,

class demo{ 
      public static void main(String a[]){

             String name="smith";

             System.out.print(name);
      }
}

Bây giờ hãy nhìn vào đầu ra mới ...

nhập mô tả hình ảnh ở đây

Ok đã giải quyết thành công lỗi đó..Trong cùng một lúc, nếu bạn có thể nhận được "không thể tìm thấy phương thức" hoặc "không thể tìm thấy lớp", lúc đầu, hãy xác định một lớp hoặc phương thức và sau khi sử dụng ..


3

Nếu bạn gặp lỗi này trong bản dựng ở một nơi khác, trong khi IDE của bạn cho biết mọi thứ đều ổn, thì hãy kiểm tra xem bạn có đang sử dụng cùng một phiên bản Java ở cả hai nơi không.

Ví dụ, Java 7 và Java 8 có các API khác nhau, do đó, việc gọi API không tồn tại trong phiên bản Java cũ hơn sẽ gây ra lỗi này.


2

Tôi cũng đã nhận được lỗi này. (mà tôi đã googled và tôi đã được chuyển đến trang này)

Vấn đề: Tôi đã gọi một phương thức tĩnh được định nghĩa trong lớp của dự án A từ một lớp được xác định trong dự án khác B. Tôi đã nhận được lỗi sau:

error: cannot find symbol

Giải pháp: Tôi đã giải quyết điều này bằng cách đầu tiên xây dựng dự án trong đó phương thức được xác định sau đó là dự án nơi phương thức được gọi từ đó.


Có, điều này có thể xảy ra nếu bạn quyết định chuyển một số chức năng có thể sử dụng lại từ gói hiện tại của bạn sang gói utils chung, nhưng sau đó bạn quên biên dịch gói chung trước khi gọi hàm từ gói hiện tại.
BuildingKofi

2

Nếu đường dẫn xây dựng Java nhật thực được ánh xạ thành 7, 8 và trong Project pom.xml thuộc tính Maven java.version được đề cập đến phiên bản Java cao hơn (9,10,11, v.v.,), hơn 7,8 bạn cần cập nhật trong pom. tập tin xml.

Trong Eclipse nếu Java được ánh xạ tới Java phiên bản 11 và trong pom.xml, nó được ánh xạ sang phiên bản Java 8. Cập nhật hỗ trợ Eclipse sang Java 11 bằng cách thực hiện các bước dưới đây trong trợ giúp IDE nhật thực -> Cài đặt phần mềm mới ->

Dán liên kết sau http://doad.eclipse.org/eclipse/updates/4.9-P-builds tại nơi làm việc với

hoặc là

Thêm (cửa sổ Popup sẽ mở) ->

Name:Hỗ trợ Java 11 Location: http://doad.eclipse.org/eclipse/updates/4.9-P-builds

sau đó cập nhật phiên bản Java trong các thuộc tính Maven của tệp pom.xml như bên dưới

<java.version>11</java.version>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>

Cuối cùng, nhấp chuột phải vào dự án Gỡ lỗi như -> Làm sạch Maven, các bước xây dựng Maven


2

GIẢI QUYẾT

Chọn Build -> Rebuild Project sẽ giải quyết nó


1
Điều đó phụ thuộc rất nhiều và thường thì không.
Maarten Bodewes

1

Có thể có nhiều kịch bản như mọi người đã đề cập ở trên. Một vài điều đã giúp tôi giải quyết điều này.

  1. Nếu bạn đang sử dụng IntelliJ

    File -> 'Invalidate Caches/Restart'

HOẶC LÀ

  1. Lớp được tham chiếu là trong một dự án khác và sự phụ thuộc đó không được thêm vào tệp xây dựng Gradle của dự án của tôi. Vì vậy, tôi đã thêm phụ thuộc bằng cách sử dụng

    compile project(':anotherProject')

va no đa hoạt động. HTH!


1

bạn đã biên dịch mã của mình bằng maven biên dịch và sau đó sử dụng kiểm tra maven để chạy nó hoạt động tốt. Bây giờ nếu bạn thay đổi một cái gì đó trong mã của bạn và sau đó không biên dịch bạn đang chạy nó, bạn sẽ gặp lỗi này.

Giải pháp: Một lần nữa biên dịch nó và sau đó chạy thử nghiệm. Đối với tôi nó làm việc theo cách này.


1

Trong trường hợp của tôi - tôi đã phải thực hiện các thao tác dưới đây:

  1. Di chuyển context.xmltập tin từ src/java/packageđến resourcethư mục (IntelliJ IDE)
  2. Thư mục sạch sẽ target.

Di chuyển tệp mà không quan tâm đến các tài liệu tham khảo có thể gây ra lỗi này. Tôi đã đáp ứng điều này. Chỉ cần Đặt lại trên Git và cẩn thận Di chuyển lại, lỗi sẽ được giải quyết.
Huy Hóm Hóm

0

Để biết gợi ý, hãy xem kỹ tên tên lớp gây ra lỗi và số dòng, ví dụ: Lỗi biên dịch [ERROR] \ application \ xxxxx.java: [44,30] lỗi: không thể tìm thấy biểu tượng

Một nguyên nhân khác là phương pháp không được hỗ trợ cho phiên bản java nói jdk7 so với 8. Kiểm tra% JAVA_HOME% của bạn


Điều này chỉ nói điều tương tự mà các câu trả lời khác nói.
Stephen C
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.