Một bình thường this
không bao giờ có thể có null
trong mã Java thực 1 và ví dụ của bạn sử dụng một bình thường this
. Xem các câu trả lời khác để biết thêm chi tiết.
Một người đủ điều kiện không bao giờ this
nên có null
, nhưng có thể phá vỡ điều này. Hãy xem xét những điều sau:
public class Outer {
public Outer() {}
public class Inner {
public Inner() {}
public String toString() {
return "outer is " + Outer.this; // Qualified this!!
}
}
}
Khi chúng ta muốn tạo một instance của Inner
, chúng ta cần thực hiện điều này:
public static void main(String[] args) {
Outer outer = new Outer();
Inner inner = outer.new Inner();
System.out.println(inner);
outer = null;
inner = outer.new Inner(); // FAIL ... throws an NPE
}
Đầu ra là:
outer is Outer@2a139a55
Exception in thread "main" java.lang.NullPointerException
at Outer.main(Outer.java:19)
cho thấy rằng nỗ lực của chúng tôi để tạo Inner
một null
tham chiếu đến nó Outer
đã thất bại.
Trên thực tế, nếu bạn dính vào bao thư "Pure Java", bạn không thể phá vỡ điều này.
Tuy nhiên, mỗi Inner
trường hợp có một final
trường tổng hợp ẩn (được gọi "this$0"
) chứa tham chiếu đến Outer
. Nếu bạn thực sự khôn lanh, có thể sử dụng các phương tiện "không thuần túy" để gán null
cho lĩnh vực này.
- Bạn có thể sử dụng
Unsafe
để làm điều đó.
- Bạn có thể sử dụng mã gốc (ví dụ: JNI) để làm điều đó.
- Bạn có thể làm điều đó bằng cách sử dụng sự phản chiếu.
Dù bạn làm theo cách nào thì kết quả cuối cùng là Outer.this
biểu thức sẽ đánh giá là null
2 .
Trong ngắn hạn, nó là có thể cho một đủ điều kiện this
để được null
. Nhưng điều đó là không thể nếu chương trình của bạn tuân theo các quy tắc "Pure Java".
1 - Tôi giảm bớt các thủ thuật như "viết" các mã bytecodes bằng tay và chuyển chúng thành Java thực, điều chỉnh các mã bytecodes bằng BCEL hoặc tương tự, hoặc nhảy vào mã gốc và xử lý các thanh ghi đã lưu. IMO, đó KHÔNG phải là Java. Theo giả thuyết, những điều như vậy cũng có thể xảy ra do lỗi JVM ... nhưng tôi không nhớ mọi lần nhìn thấy báo cáo lỗi.
2 - Trên thực tế, JLS không cho biết hành vi sẽ như thế nào, và nó có thể phụ thuộc vào việc triển khai ... trong số những thứ khác.