2013-05-25 34 views
6

Tôi có một chuỗi trong ngăn xếp, chẳng hạn như "tại alexei.ATable $ IndexOfATable.access $ 1400 (ATable.java:80)"

Và tôi thú vị, số 1400 là gì? Chỉ số lớp bên trongOfATable chỉ có 3 trường, chứ không phải 1400.

Tò mò, Tại sao số 1400 quá lớn?

debug: 
Exception in thread "main" java.lang.NullPointerException 
    at alexei.ATable$IndexOfATable.compareTwoRows(ATable.java:181) 
    at alexei.ATable$IndexOfATable.access$1400(ATable.java:80) 
    at alexei.ATable.updateIndex(ATable.java:501) 
    at alexei.ATable.addRow(ATable.java:361) 
    at learn.Base.main(Base.java:18) 
Java Result: 1 
+1

'.. $ 1400' chỉ là một phần của số nhận dạng cụ thể - số nhận dạng có' $ 'trong chúng là * bình thường * được tạo bởi trình biên dịch/công cụ (bao gồm các lớp ẩn danh trong javac). Nó không cần liên quan đến chỉ mục hoặc kích thước. Xem [câu trả lời này] (http://stackoverflow.com/a/4636669/2246674) cho những gì "bình thường" có nghĩa là. – user2246674

+0

Tôi đã nhận ra, chúng được đánh số theo bước 100: truy cập $ 000, truy cập $ 100, truy cập $ 200 và cứ tiếp tục – Dumas45

Trả lời

15

Đây là phương pháp tổng hợp mà trình biên dịch tạo ra để đối phó với lớp bên trong. Java bytecode không có khái niệm về một lớp bên trong, vì vậy khi nó được biên dịch nó thực hiện các thủ thuật khác nhau để "giả" sự hiện diện của một khi chạy. Trong trường hợp cụ thể này, lớp phương thức access$XXX thường được kết hợp với việc cung cấp tham chiếu đến lớp bên ngoài từ lớp bên trong. Những thực thể tổng hợp như vậy là dấu hiệu của điều này. (Bạn thường có thể phát hiện chúng bằng sự hiện diện của một đô la trong tên lớp/phương thức.)

Tại sao số 1400 quá lớn?

Đó là một định danh hoàn toàn tùy ý mà chỉ trình biên dịch cần biết (và do đó chọn.) Miễn là nó duy nhất trong ứng dụng, nó có thể là bất cứ điều gì (kỹ thuật nói, nó thậm chí không phải là một số.)

Đối với vị trí của sự cố, hãy xem dòng được cho bởi dấu vết ngăn xếp nhiều nhất: ATable.java:181.

Các vấn đề liên quan