2012-04-02 15 views
12

मैं एक जावा समारोह testForNullक्या फ़ंक्शन में पारित चर के नाम को खोजने के लिए जावा में कोई तरीका है?

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

कहा जाता है मैं इसका उपयोग सुनिश्चित करने के लिए वे अशक्त नहीं हैं एक से अधिक ऑब्जेक्ट का परीक्षण करने के लिए है। लेकिन, मैं इस तरह के चर के नाम बताने में असमर्थ हूं।

उदाहरण के लिए। अगर मैं कहूँ

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

मैं बता नहीं सकता जो तीन लाइनों की वजह से उत्पादन "ऑब्जेक्ट रिक्त है"। बेशक, मैं बस कार्य करने के लिए दूसरा पैरामीटर जोड़ें और

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

की तरह कुछ है लेकिन मैं जानना चाहता हूँ कि क्या यह यह स्पष्ट रूप से गुजर बिना वैरिएबल का नाम निकालना संभव है चाहते हैं कर सकते हैं। धन्यवाद।

+0

[प्रतिबिंब] के साथ भी नहीं (http://stackoverflow.com/questions/744226/java-reflection-how-to-get-the-name-of-a-variable)। – paislee

+2

इस के लिए जिम्मेदार भाषा में कुछ भी नहीं है। हालांकि, मुझे लगता है कि यह एक अतिरिक्त प्रसंस्करण उपकरण (उदाहरण के लिए बाइटकोड का निरीक्षण/संशोधित) के साथ किया जा सकता है। वैकल्पिक रूप से, ऐसे टूल का उपयोग करें जो मेल खाने वाले मानों से स्वत: भरने वाले उचित टेम्पलेट्स को सम्मिलित कर सके ;-) –

+3

आपका कथन 'मैं नहीं बता सकता कि तीन पंक्तियों में से कौन सा "ऑब्जेक्ट शून्य है" आउटपुट। आपके आउटपुट में केवल सच है। आप नए अपवाद का उपयोग कर सकते हैं ("ऑब्जेक्ट शून्य है")। प्रिंटस्टैकट्रेस यह पता लगाने के लिए कि यह कहां था, या आप डीबगर का उपयोग कर सकते हैं और ब्रेकपॉइंट डाल सकते हैं। यह ऐसी चीज की तरह दिखता है जो एक भाषा सुविधा के बजाय बेहतर लॉगिंग, या डीबगर की मांग करता है। –

उत्तर

15

पर विचार करें कि पैरामीटर एक चर गया हो सकता है नहीं किया है (और इसलिए कोई नाम नहीं होगा):

testForNull(x != y); 
5

नहीं, ऐसा कोई रास्ता नहीं है। आपको चर के नाम को स्पष्ट रूप से पास करना होगा। हालांकि, अगर आपके ऑब्जेक्ट में फ़ील्ड 'नाम' है या toString() फ़ंक्शन के माध्यम से इसका नाम प्रदर्शित करता है, तो यह आपकी मदद कर सकता है।

+10

यदि कोई ऑब्जेक्ट नहीं है तो एक ऑब्जेक्ट अपने नाम को ToString() के माध्यम से प्रदर्शित करने की संभावना नहीं है ;-) –

+0

True। हालांकि, 'testForNull() '(जो शून्य के लिए परीक्षण करता है) को पता चलेगा कि इसे' शून्य 'प्रदर्शित करना चाहिए या ऑब्जेक्ट की' toString()' को कॉल करना चाहिए। – Vincent

+0

@DonRoby सही है। ऑब्जेक्ट शून्य होने पर ToString() विधि मेरी सहायता नहीं करेगी। इसलिए यह पता लगाने के मेरे उद्देश्य को हराया जाएगा कि कौन सा ऑब्जेक्ट शून्य था। – CodeBlue

1

यह वही एक डिबगर के लिए है। इस प्रोग्रामेटिक तरीके से करने का कोई तरीका नहीं है। अगर मैं testForNull(1 + 1) का आह्वान करता हूं तो क्या होगा। फिर परिवर्तनीय नाम क्या है?

ग्रहण में अंतर्निहित जावा के लिए एक ग्राफिकल और उपयोग में आसान डीबगर है। इसका उपयोग करना सीखना लंबे समय तक लाभांश का भुगतान करेगा, और यह भी आपकी समस्या का तत्काल समाधान होगा।

+5

खैर, डिबगर्स एक प्रोग्राम हैं ... – Jeffrey

+0

क्षमा करें। "प्रतिबिंब के माध्यम से" प्रोग्रामेटिक रूप में "। और चूंकि हम पैडेंटिक हैं, "डिबगर्स ** प्रोग्राम ** ** हैं।" –

+0

टच। हालांकि, [यह] (http://stackoverflow.com/a/744341/758280) बाइटकोड विश्लेषण ढांचे के उत्तर लिंक का उपयोग करता है जिसे जावा द्वारा रनटाइम पर स्वयं निरीक्षण करने के लिए उपयोग किया जा सकता है। – Jeffrey

0

आप विधि कॉल को फ़ोरैच में रख सकते हैं और प्रत्येक ऑब्जेक्ट के लिए संदर्भ आईडी सेट कर सकते हैं, भले ही वह उस विशिष्ट ऑब्जेक्ट के लिए शून्य या शून्य न हो।

-2

जावा एक ऑब्जेक्ट उन्मुख भाषा है, इसलिए उत्तर "सबसे निश्चित रूप से है!" आप एक पैरामीटर के रूप में पारित चर के नाम बता सकते हैं। ऐसा करने के लिए, इस कोशिश ...

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

    public Value(String name, T value) 
    { 
     this.name = name; 
     this.value = value; 
    } 
} 
अब आप अपने तरीकों में

, आप मूल्य के उदाहरण के रूप में सभी मापदंडों स्वीकार करते हैं, निम्नलिखित विधि है जो कक्षाओं संख्या होने एक आधार वर्ग के रूप में के साथ बनाया केवल मान स्वीकार करेंगे के रूप में होगा (जो लांग, फ्लोट, डबल, इत्यादि होगा) ...

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; 
} 

और यह सब कुछ है! मैं एक सामान्य वर्ग का उपयोग करें ताकि मूल्य किसी भी प्रकार में पारित करने के लिए इस्तेमाल किया जा सकता - तैरता है, चाहता है, डबल, BigInteger, स्ट्रिंग - उदाहरण के लिए ...

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

इसके अलावा, विधि ऊपर बस एक उदाहरण है - में किसी भी विधि को स्वीकार करने वाली किसी भी विधि का अभ्यास उसके नाम तक पहुंच सकता है।

अच्छी किस्मत और आपका सभी कोड निर्दोष रूप से संकलित हो सकता है!

रॉडने

+1

= b क्या होता है यदि 'getNameOfParameter' को' parm1' के रूप में शून्य प्राप्त होता है? – frozenkoi

0

हाँ, पर मैं यह सिफारिश नहीं होगा और यह असाधारण मुश्किल होगा।बजाय प्रयास करें assert:

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

आप क्या चाहते हैं ऐसा करने के लिए, यदि आप स्रोत कोड है, वर्तमान धागा http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#currentThread()

मिल जाओ एक स्टैक ट्रेस http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace()

जाओ द्वितीय से अंतिम तत्व, वर्ग का नाम, फ़ाइल का नाम, और रेखा संख्या, फिर उस पंक्ति को मुद्रित करें, या इसे http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html#method_summary

0

बह, मूल प्रश्न को देखने के बाद फिर से, यह एक गैर स्टार्टर है।

प्रश्न हमें उन साधनों को प्रदान करने में सक्षम होने के लिए कहता है जिनके द्वारा चेकफोरनुल() विधि में पारित मूल्य मान नाम पुनर्प्राप्त कर सकता है - और यहां किकर है ... केवल जब मान शून्य है।

बिल्कुल कोई रास्ता नहीं है कि आप "शून्य" या नलपॉन्टर अपवाद युक्त स्ट्रिंग के अलावा किसी शून्य मूल्य से कुछ भी प्राप्त करने जा रहे हैं।

लेकिन, सामान्य रूप से, बचाव के लिए ऑब्जेक्ट ओरिएंटेशन। जैसा कि मैंने उपरोक्त उल्लेख किया है वैल्यू क्लास बनाएं। अब इसमें एक isNull() विधि जोड़ें। इस वैल्यू क्लास का उपयोग किसी भी वैल्यू के लिए करें जिसे आप डिबगिंग टेक्स्ट डंप करना चाहते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे