Sẽ null instanceof SomeClass
trở lại false
hoặc ném một NullPointerException
?
Sẽ null instanceof SomeClass
trở lại false
hoặ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 SomeClass
là false
nếu x
là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
instanceof
toán tử làtrue
nếu giá trị của RelationalExpression khôngnull
và 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 it
vì 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
instanceof
Toá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
instanceof
toán tử làtrue
nếu giá trị của RelationalExpression khôngnull
và 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ềtrue
nế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ảfalse
khá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
.
s
chỉ 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) null
tham chiếu theo nghĩa đen.
null
không phải là dữ liệu chuỗi, bất kể biến nào đang trỏ đến nó. s instanceof String
khô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 String
và 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. instanceof
sẽ trở lại false
nế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 null
có 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 null
khô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 false
hoặctrue
do đó <referenceVariable> instanceof <SomeClass>
trả về false
khi referenceVariable
giá trị là null.
Các instanceof
nhà điều hành không cần rõ ràng null
séc, vì nó không ném một NullPointerException
nếu toán hạng lànull
.
Trong thời gian chạy, kết quả của instanceof
toá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
, instanceof
toá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 instanceof
là 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");
}
}