2012-04-02 21 views
12

Tôi có một chức năng Java gọi testForNullCó cách nào trong Java để tìm tên biến được chuyển đến một hàm không?

public static void testForNull(Object obj) 
    { 
    if (obj == null) 
     { 
     System.out.println("Object is null"); 
     } 
    } 

tôi sử dụng nó để kiểm tra nhiều đối tượng để đảm bảo chúng không phải là null. Nhưng, tôi không thể nói tên của biến theo cách đó.

Ví dụ: nếu tôi nói

testForNull(x); 
    testForNull(y); 
    testForNull(z); 

Tôi không thể biết được ba dòng nào gây ra đầu ra "Đối tượng là rỗng". Tất nhiên, tôi chỉ có thể thêm tham số khác đến chức năng và có cái gì đó như

testForNull(x, "x"); 
    testForNull(y, "y"); 
    testForNull(z, "z"); 

Nhưng tôi muốn biết liệu chúng ta có thể suy ra tên của biến mà không đi qua nó một cách rõ ràng. Cảm ơn.

+0

Không ngay cả với [phản chiếu] (http://stackoverflow.com/questions/744226/java-reflection-how-to-get-the-name-of-a-variable). – paislee

+2

Không có gì trong ngôn ngữ để giải thích cho việc này. Tuy nhiên, tôi tưởng tượng nó có thể được thực hiện với một công cụ xử lý bổ sung (ví dụ: kiểm tra/sửa đổi bytecode). Ngoài ra, sử dụng một công cụ có thể chèn các mẫu thích hợp tự động điền với các giá trị phù hợp ;-) –

+3

tuyên bố của bạn 'Tôi không thể biết được ba dòng nào gây ra đầu ra "Object is null". chỉ đúng trong đầu ra của bạn. Bạn có thể sử dụng ngoại lệ mới ("đối tượng là null") printStackTrace để tìm ra chính xác vị trí của nó, hoặc bạn có thể sử dụng trình gỡ lỗi và đặt điểm ngắt tại đó. Điều này trông giống như một cái gì đó mà kêu gọi đăng nhập tốt hơn, hoặc một trình gỡ lỗi, thay vì một tính năng ngôn ngữ. –

Trả lời

15

Hãy xem xét rằng các tham số có thể không phải là một biến (và do đó sẽ không có một tên):

testForNull(x != y); 
5

Không, không có cách nào như vậy. Bạn sẽ phải chuyển tên rõ ràng của biến. Tuy nhiên, nếu đối tượng của bạn có tên 'trường' hoặc hiển thị tên của nó thông qua hàm toString(), thì điều đó có thể giúp bạn.

+10

Một đối tượng không thể hiển thị tên của nó thông qua toString() nếu nó là null ;-) –

+0

True. Tuy nhiên, 'testForNull()' (mà các phép thử cho null) sẽ biết nếu nó sẽ hiển thị 'null' hoặc gọi' toString() 'của đối tượng. – Vincent

+0

@DonRoby là đúng. Phương thức toString() sẽ không giúp tôi nếu đối tượng là null. Do đó, nó sẽ đánh bại mục đích của tôi trong việc tìm ra đối tượng nào là rỗng. – CodeBlue

1

Đây là những gì một trình gỡ lỗi là cho. Không có cách nào để làm điều này theo chương trình. Nếu tôi gọi testForNull(1 + 1) thì sao? Tên biến là gì?

Eclipse có trình gỡ lỗi đồ họa và dễ sử dụng để tích hợp sẵn Java. Học cách sử dụng nó sẽ trả cổ tức trong thời gian dài, và sẽ là giải pháp ngay lập tức cho vấn đề của bạn.

+5

Vâng, các trình gỡ rối là một chương trình ... – Jeffrey

+0

Xin lỗi. "Lập trình" như trong "qua phản chiếu". Và kể từ khi chúng tôi đang được pedantic, "debuggers ** là chương trình **". –

+0

Touché. Tuy nhiên, [this] (http://stackoverflow.com/a/744341/758280) trả lời các liên kết đến một khung phân tích bytecode có thể được Java sử dụng để kiểm tra chính nó khi chạy. – Jeffrey

0

bạn có thể thực hiện cuộc gọi phương thức trong foreach và đặt ID tham chiếu cho từng đối tượng mà bạn đang trải qua, ngay cả khi đối tượng đó trả về null hoặc không null cho đối tượng cụ thể đó.

-2

Java là ngôn ngữ hướng đối tượng, do đó câu trả lời là "chắc chắn nhất!" bạn có thể cho biết tên của biến được truyền dưới dạng tham số. Để làm như vậy, hãy thử điều này ...

class Value<T> extends Object 
{ 
    T value; 
    String name; 

    public Value(String name, T value) 
    { 
     this.name = name; 
     this.value = value; 
    } 
} 

Bây giờ trong phương pháp của bạn, bạn sẽ chấp nhận tất cả tham số là giá trị được tạo bằng các lớp có Số làm lớp cơ sở (đó sẽ là Dài, Nổi, Đôi, v.v ...)

public String SomeMethodWantingToKnowParameterNames(Value<? extends Number> parm1) 
{ 
    if (parm1 != null) 
    { 
     // Do your work with the parameter - it's name can be accessed via parm1.name 
     // This is only an example 
     // You would probably want to write an accessor for name 
     return parm1.name; 
    } 

    // Return null for null 
    return null; 
} 

Và đó là tất cả để có nó! Tôi sử dụng một lớp chung để giá trị gia tăng có thể được sử dụng để vượt qua trong bất kỳ loại - Floats, Longs, đôi, BigInteger, String - ví dụ ...

Value<Float> vFloat = new Value<Float>("MyFloat", 0.0); 

Ngoài ra, các phương pháp trên chỉ đơn giản là một ví dụ - trong thực hành bất kỳ phương pháp nào chấp nhận Giá trị có thể truy cập tên của nó.

Chúc may mắn và tất cả mã của bạn có thể biên dịch hoàn hảo!

Rodney

+1

= b Điều gì xảy ra nếu 'getNameOfParameter' nhận null là' parm1'? – frozenkoi

0

Có, nhưng tôi không khuyên bạn nên nó và nó sẽ đặc biệt khó.Hãy thử assert thay vì:

http://docs.oracle.com/javase/1.4.2/docs/guide/lang/assert.html

Để làm những gì bạn muốn, nếu bạn có mã nguồn, được xử lí hiện tại http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#currentThread()

Nhận một stack trace http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace()

Lấy Từ thứ 2 đến phần tử cuối cùng, tên lớp, tên tệp và số dòng, sau đó in dòng đó hoặc phân tích cú pháp nó http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html#method_summary

0

Bah, Sau khi xem ảnh gốc estion một lần nữa, đây là một không khởi động.

Câu hỏi yêu cầu chúng tôi có thể cung cấp phương tiện mà giá trị được chuyển vào phương thức CheckForNull() có thể truy xuất tên giá trị - và đây là kicker ... chỉ khi giá trị rỗng.

Có hoàn toàn không có cách nào bạn sẽ nhận được bất cứ điều gì từ một giá trị null khác hơn là một chuỗi có chứa "null" hoặc một NullPointerException.

Nhưng, như thường lệ, định hướng đối tượng để giải cứu. Tạo một lớp giá trị như tôi đã đề cập ở trên. Bây giờ thêm một phương thức isNull() vào nó. Sử dụng lớp giá trị này cho bất kỳ giá trị nào bạn muốn kết xuất văn bản gỡ lỗi.

Các vấn đề liên quan