nền
Tôi muốn hiểu tại sao một đoạn mã không không ném một NullPointerException.Tại sao mã này không ném NullPointerException?
Source Code
Xét đoạn mã sau:
public class Agent {
public List files = new ArrayList();
public void deliver() {
if(files != null && files.iterator().hasNext()) {
File file = (File)files.iterator().next();
}
files = new ArrayList();
}
}
Phương pháp deliver
được gọi là liên tục, trong khi các mã sau chạy trong một thread riêng biệt:
public void run() {
agent.files = null;
}
Chỉ có một là duy nhất agent
bản sao.
Vấn đề
Một NullPointerException là không bao giờ ném.
Tuy nhiên, khi deliver
tạm dừng phương pháp, ngay cả đối với 0 mili giây, một NullPointerException được ném như mong đợi:
public void deliver() {
if(files != null) {
Thread.currentThread().sleep(0);
if(files.iterator().hasNext()) {
File file = (File)files.iterator().next();
}
}
files = new ArrayList();
}
sự hiểu biết của tôi là có, về mặt lý thuyết, một điều kiện cuộc đua giữa kiểm tra files == null
và gọi files.iterator().hasNext()
. Trong thực tế, tôi không thể kích hoạt điều kiện chủng tộc mà không giới thiệu tạm dừng (tức là, tách kiểm tra null khỏi cuộc gọi phương thức tiếp theo).
Câu hỏi
Tại sao deliver
phương pháp đầu tiên không ném một ngoại lệ khi kiểm tra và sử dụng rỗng được kết hợp trong báo cáo kết quả giống nhau không?
Bạn có thể đăng đầu ra 'javap' ở những khu vực điều kiện xung quanh thích hợp không? – hexafraction
Điều gì sẽ xảy ra khi bạn tạo 'tập tin'' dễ bay hơi? – OldCurmudgeon