Sẽ null instanceof SomeClasstrở lại falsehoặc ném một NullPointerException?
Sẽ null instanceof SomeClasstrở lại falsehoặc ném một NullPointerException?
Câu trả lời:
Không, không cần kiểm tra null trước khi sử dụng instanceof.
Biểu thức x instanceof SomeClasslà falsenếu xlànull .
Từ Đặc tả ngôn ngữ Java, phần 15.20.2, "Thể hiện toán tử so sánh kiểu" :
"Trong thời gian chạy, kết quả của
instanceoftoán tử làtruenếu giá trị của RelationalExpression khôngnullvà tham chiếu có thể được chuyển sang ReferenceType mà không tăng aClassCastException. Nếu không thì kết quả làfalse."
Vì vậy, nếu toán hạng là null, kết quả là sai.
try itvì hành vi hiện tại không giống với hành vi được đảm bảo .
Effective Java- amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683
instanceofToán tử của Java là một phần của Java 1.0, được phát hành gần 20 năm trước. Thay đổi hành vi bây giờ theo cách có thể phá vỡ mã hiện tại là không thể, vắng mặt một số lợi ích vượt xa chi phí khổng lồ đó. Hai mươi năm trước, có thể đã có những cuộc tranh luận để trả lại sự thật nếu cuộc tranh luận có thể được đưa ra, hoặc đưa ra một ngoại lệ cho một cuộc tranh luận không có giá trị. Nhưng những định nghĩa đó sẽ yêu cầu kiểm tra null riêng biệt.
Câu hỏi rất hay thực sự. Tôi chỉ cố gắng cho bản thân mình.
public class IsInstanceOfTest {
public static void main(final String[] args) {
String s;
s = "";
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
s = null;
System.out.println((s instanceof String));
System.out.println(String.class.isInstance(s));
}
}
Bản in
true
true
false
false
JLS / 15.20.2. Kiểu toán tử so sánh
Trong thời gian chạy, kết quả của
instanceoftoán tử làtruenếu giá trị của RelationalExpression khôngnullvà tham chiếu có thể được chuyển sang ReferenceType mà không tăng aClassCastException. Nếu không thì kết quả làfalse.
API / Class # isInstance (Object)
Nếu
Classđối tượng này đại diện cho một giao diện, phương thức này trả vềtruenếu lớp hoặc bất kỳ siêu lớp nào củaObjectđối số đã chỉ định thực hiện giao diện này; nó trảfalsekhác. NếuClassđối tượng này đại diện cho một kiểu nguyên thủy, phương thức này trả vềfalse.
schỉ là một biến tham chiếu đối tượng. Nó có thể đề cập đến một đối tượng thực sự tồn tại ( "") hoặc nó có thể đề cập đến một (các) nulltham chiếu theo nghĩa đen.
nullkhông phải là dữ liệu chuỗi, bất kể biến nào đang trỏ đến nó. s instanceof Stringkhông giống như field.getType().equals(String.class), ví dụ.
s instanceof String, sđược thay thế bằng giá trị thực, do đó, nó sẽ trở thành "" instanceof Stringvà null instanceof String. Suy nghĩ về nó như thế này có thể có ý nghĩa hơn.
Không, không phải vậy. instanceofsẽ trở lại falsenếu toán hạng đầu tiên của nó là null.
Cũng như một miếng ngon :
Thậm chí sẽ trở lại .(((A)null)instanceof A)false
(Nếu typecasting nullcó vẻ đáng ngạc nhiên, đôi khi bạn phải làm điều đó, ví dụ trong các tình huống như thế này:
public class Test
{
public static void test(A a)
{
System.out.println("a instanceof A: " + (a instanceof A));
}
public static void test(B b) {
// Overloaded version. Would cause reference ambiguity (compile error)
// if Test.test(null) was called without casting.
// So you need to call Test.test((A)null) or Test.test((B)null).
}
}
Vì vậy, Test.test((A)null)sẽ in a instanceof A: false.)
Tái bút: Nếu bạn đang tuyển dụng, xin đừng sử dụng nó như một câu hỏi phỏng vấn xin việc. : D
Không . Chữ Java nullkhông phải là một thể hiện của bất kỳ lớp nào. Vì vậy, nó không thể là một thể hiện của bất kỳ lớp nào. instanceof sẽ trả về một trong hai falsehoặctrue do đó <referenceVariable> instanceof <SomeClass>trả về falsekhi referenceVariablegiá trị là null.
Các instanceofnhà điều hành không cần rõ ràng nullséc, vì nó không ném một NullPointerExceptionnếu toán hạng lànull .
Trong thời gian chạy, kết quả của instanceoftoán tử là đúng nếu giá trị của biểu thức quan hệ khôngnull và tham chiếu có thể được chuyển sang loại tham chiếu mà không đưa ra ngoại lệ truyền lớp.
Nếu toán hạng là null, instanceoftoán tử trả vềfalse và do đó, kiểm tra null rõ ràng là không bắt buộc.
Hãy xem xét ví dụ dưới đây,
public static void main(String[] args) {
if(lista != null && lista instanceof ArrayList) { //Violation
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}
Cách sử dụng đúng instanceoflà như dưới đây,
public static void main(String[] args) {
if(lista instanceof ArrayList){ //Correct way
System.out.println("In if block");
}
else {
System.out.println("In else block");
}
}