2012-04-30 26 views
17

Có thể là câu hỏi ngớ ngẩn, nhưng làm thế nào tôi có thể vượt qua null để phương pháp mất long hoặc int?Làm thế nào để vượt qua null để phương pháp dự kiến ​​dài hay int?

Ví dụ:

TestClass{ 
    public void iTakeLong(long id); 
    public void iTakeInt(int id); 
} 

nay làm thế nào tôi có thể vượt qua null cho cả methos:

TestClass testClass = new TestClass(); 
testClass.iTakeLong(null); // Compilation error : expected long, got null 
testClass.iTakeInt(null); // Compilation error : expected int, got null 

Suy nghĩ, gợi ý?

+1

Tại sao bạn muốn để vượt qua null đến một phương pháp như vậy? Bạn mong đợi nó làm gì? –

Trả lời

31

Vấn đề là intlong là nguyên thủy. Bạn không thể vượt qua null thành giá trị nguyên thủy.

Bạn chắc chắn có thể sử dụng các lớp bao bọc IntegerLong thay vì longint trong chữ ký phương thức của mình.

+9

Vì vậy, câu trả lời ngắn gọn: bạn không thể. –

2

Bạn không thể làm điều đó. Các kiểu nguyên thủy không thể là null trong Java.

Nếu bạn muốn vượt qua null bạn phải thay đổi phương pháp chữ ký của bạn để

public void iTakeLong(Long id); 
public void iTakeInt(Integer id); 
10

Bạn không thể - không có giá trị như vậy. Nếu bạn có thể thay đổi chữ ký phương thức, thay vào đó bạn có thể biến nó thành kiểu tham chiếu thay thế. Java cung cấp một lớp "wrapper" bất di bất dịch đối với từng lớp nguyên thủy:

class TestClass { 
    public void iTakeLong(Long id); 
    public void iTakeInt(Integer id); 
} 

Bây giờ bạn có thể vượt qua một tham chiếu null hoặc một tham chiếu đến một thể hiện của loại wrapper. Autoboxing sẽ cho phép bạn viết:

iTakeInt(5); 

Trong phương pháp này, bạn có thể viết:

if (id != null) { 
    doSomethingWith(id.intValue()); 
} 

hoặc sử dụng unboxing tự động:

if (id != null) { 
    doSomethingWith(id); // Equivalent to the code above 
} 
+0

không thể thay đổi phương thức đó vì có triển khai kết hợp chặt chẽ dựa trên phương pháp đó. – Rachel

+5

@Rachel: Sau đó, bạn không thể vượt qua null, nó đơn giản như vậy. Có 2^32 giá trị cho một 'int' - bạn đang cố gắng để giới thiệu thêm một. Không có đủ bit trong giá trị 'int' để biểu thị giá trị đó. –

+0

@JonSkeet: Vâng, tôi sẽ phải thay đổi một số thiết kế của tôi để làm cho tôi kiểm tra null trước khi gọi chức năng này. – Rachel

3

Sử dụng các lớp Wrapper:

TestClass{ 
    public void iTakeLong(Long id); 
    public void iTakeInt(Integer id); 
    public void iTakeLong(long id); 
    public void iTakeInt(int id); 
} 
5

Bạn có thể bỏ giá trị không vào nguyên thủy lớp bao bọc, sẽ biên dịch.

TestClass testClass = new TestClass(); 
testClass.iTakeLong((Long)null); // Compiles 
testClass.iTakeInt((Integer)null); // Compiles 

Nhưng, điều này sẽ ném NullPointerException khi được thực thi. Không có nhiều giúp đỡ, nhưng nó rất hữu ích để biết rằng bạn có thể vượt qua các wrapper tương đương với một phương thức mà có một nguyên thủy như một đối số.

4

Tùy thuộc vào số phương thức bạn có và số lượng cuộc gọi, bạn có lựa chọn khác.

Thay vì phân phối séc rỗng trong toàn bộ hệ thống mã của bạn, bạn có thể viết phương thức đóng gói (N.B., Không phải là giấy gói loại (int => Integer), nhưng bạn phương pháp mà bọc):

public void iTakeLong(Long val) { 
    if (val == null) { 
     // Do whatever is appropriate here... throwing an exception would work 
    } else { 
     iTakeLong(val.longValue()); 
    } 
} 
0

typecasting giá trị để Long như dưới đây sẽ làm cho các lỗi biên dịch biến mất nhưng cuối cùng sẽ kết thúc trong NullPointerException.

testClass.iTakeLong((Long)null) 

Một giải pháp là sử dụng loại Long thay vì nguyên thủy long.

public void iTakeLong(Long param) { } 

giải pháp khác là sử dụng org.apache.commons.lang3.math.NumberUtils

testClass.iTakeLong(NumberUtils.toLong(null)) 
Các vấn đề liên quan