Gần đây tôi đã tìm thấy một lỗi gây ra một NullPointerException. Ngoại lệ bị bắt và ghi lại bằng cách sử dụng câu lệnh slf4j tiêu chuẩn. Mã tóm lược bên dưới:NullPointerException ngăn xếp theo dõi không có sẵn mà không có đại lý gỡ lỗi
for(Action action : actions.getActions()) {
try {
context = action.execute(context);
} catch (Exception e) {
logger.error("...", e);
break;
}
}
Như bạn thấy, không có gì lạ mắt. Tuy nhiên, trong tất cả các câu lệnh khai báo ngoại lệ mà chúng ta có, chỉ một câu lệnh không in dấu vết ngăn xếp. Tất cả nó in là thông báo (được biểu diễn là "...") và tên của lớp ngoại lệ (java.lang.NullPointerException).
Vì dấu vết ngăn xếp trên một ngoại lệ được tải xuống, tôi nghĩ có thể có sự cố sắp xếp lại lệnh của một số loại và quyết định gọi e.getStackTrace() trước câu lệnh nhật ký. Điều này không có sự khác biệt.
Vì vậy, tôi đã quyết định khởi động lại với tác nhân gỡ lỗi được bật. Tuy nhiên, bởi vì tôi thậm chí gắn liền với quá trình này, tôi nhận thấy rằng bây giờ các dấu vết ngăn xếp được in ấn. Vì vậy, rõ ràng sự hiện diện của các đại lý gỡ lỗi gây ra một số thông tin gỡ lỗi bổ sung để trở nên có sẵn.
Từ đó, tôi đã khắc phục nguyên nhân gốc của ngoại lệ. Nhưng tôi muốn tìm hiểu lý do tại sao ngăn xếp ngăn xếp không có sẵn mà không có trình gỡ lỗi. Có ai biết không?
Làm rõ: đây không phải là sự cố đăng nhập. Hãy tưởng tượng mệnh đề cùng try/catch, nhưng trong đánh bắt, tôi in giá trị của:
e.getStackTrace().length
Nếu không có một trình gỡ lỗi này in '0', với một trình gỡ lỗi nó in một số dương (9 trong trường hợp này).
Thông tin thêm: điều này xảy ra trên JDK 1.6.0_13, 64bit, amd64, Linux 2.6.9
bạn đang sử dụng vm nào? hành vi đó âm thanh * rất kỳ lạ. –
JDK 1.6.0_13, 64 bit trên Linux 2.6.9 – omerkudat
Điều gì xảy ra khi bạn 'ném NullPointerException()' mới vào trong thử? – seth