2012-04-02 12 views
12

Ho una funzione Java chiamato testForNullC'è un modo in Java per trovare il nome della variabile che è stata passata a una funzione?

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

lo uso per testare più oggetti per assicurarsi che non sono nulli. Ma, non sono in grado di dire il nome della variabile in questo modo.

Ad es. se dico

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

Non posso dire quale delle tre linee ha causato il "Oggetto è nullo" in uscita. Naturalmente, posso semplicemente aggiungere un altro parametro alla funzione e avere qualcosa di simile

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

Ma voglio sapere se è possibile dedurre il nome della variabile senza passare esplicitamente. Grazie.

+0

Neanche con [reflection] (http://stackoverflow.com/questions/744226/java-reflection-how-to-get-the-name-of-a-variable). – paislee

+2

Non c'è niente nella lingua per tener conto di ciò. Tuttavia, immagino che potrebbe essere fatto con uno strumento di elaborazione aggiuntivo (ad esempio, ispezionare/modificare bytecode). In alternativa, usa uno strumento che può inserire i modelli appropriati riempiti automaticamente con valori corrispondenti ;-) –

+3

la tua affermazione "Non riesco a capire quale delle tre linee abbia causato l'output" L'oggetto è nullo ". è vero solo nel tuo output. È possibile utilizzare la nuova eccezione ("oggetto è null"). PrintStackTrace per scoprire esattamente dove si trovava, oppure è possibile utilizzare un debugger e inserire lì un punto di interruzione. Questo sembra più qualcosa che richiede una registrazione migliore, o un debugger, invece di una funzione linguistica. –

risposta

15

Si consideri che il parametro non avrebbe potuto essere una variabile (e quindi non avrebbe un nome):

testForNull(x != y); 
5

No, non esiste un modo. Dovrai passare esplicitamente il nome della variabile. Tuttavia, se il tuo oggetto ha un campo "nome" o visualizza il suo nome tramite la funzione toString(), allora questo potrebbe aiutarti.

+10

È improbabile che un oggetto mostri il suo nome tramite toString() se è null ;-) –

+0

Vero. Tuttavia, 'testForNull()' (che verifica il null) saprà se dovrebbe visualizzare 'null' o chiamare' toString() 'dell'oggetto. – Vincent

+0

@DonRoby ha ragione. Il metodo toString() non mi aiuterà se l'oggetto è nullo. Pertanto, sconfiggerei il mio scopo di scoprire quale oggetto era nullo. – CodeBlue

1

Questo è ciò che un debugger è per. Non c'è modo di farlo a livello di programmazione. Cosa succede se invoco testForNull(1 + 1). Qual è il nome della variabile allora?

Eclipse ha un debugger grafico e di facile utilizzo per Java integrato. Imparare come usarlo pagherà i dividendi a lungo termine e sarà anche la soluzione immediata al tuo problema.

+5

Bene, i debugger sono un programma ... – Jeffrey

+0

Scusami. "Programmaticamente" come in "via riflessione". E poiché siamo pedanti, "i debugger ** sono programmi **". –

+0

Touché. Tuttavia, [this] (http://stackoverflow.com/a/744341/758280) rispondono a una struttura di analisi bytecode che potrebbe essere utilizzata da Java per ispezionarsi al momento dell'esecuzione. – Jeffrey

0

è possibile inserire la chiamata al metodo in un foreach e impostare un ID di riferimento per ciascun oggetto che si sta attraversando, anche se restituisce null o non null per quell'oggetto specifico.

-2

Java è un linguaggio orientato agli oggetti, quindi la risposta è "sicuramente!" puoi dire il nome della variabile passata come parametro. Per fare ciò, provare questo ...

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

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

Ora nei vostri metodi, si dovrebbe accettare tutti i parametri come le istanze di valore, come nel seguente metodo che avrebbe accettato solo valori creati con le classi con numero come classe base (che sarebbe lungo, float, double, ecc) ...

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

E questo è tutto quello che c'è da fare! Io uso una classe generica in modo che valore può essere utilizzato per passare in qualsiasi tipo - Galleggianti, Longs, Doppio, BigInteger, String - per esempio ...

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

Inoltre, il metodo di cui sopra è semplicemente un esempio - in Praticare qualsiasi metodo che accetti un Valore potrebbe accedere al suo nome.

Buona fortuna e tutto il codice può essere compilato in modo impeccabile!

Rodney

+1

= b Cosa succede se 'getNameOfParameter' riceve null come' parm1'? – frozenkoi

0

Sì, ma io non lo consiglio e sarebbe estremamente difficile.Prova assert invece:

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

di fare quello che vuoi, se avete il codice sorgente, ottenere il thread corrente http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#currentThread()

ottenere una traccia dello stack http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace()

Prendi il 2 ° all'ultimo elemento, il nome della classe, il nome del file e il numero di riga, quindi stampare quella riga o analizzarlo http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html#method_summary

0

Bah, dopo aver guardato l'originale ancora una volta, questo è un non-starter.

La domanda ci chiede di essere in grado di fornire un mezzo mediante il quale un valore passato in un metodo CheckForNull() può recuperare il nome dei valori - ed ecco il kicker ... solo quando il valore è nullo.

Non è assolutamente possibile ottenere nulla da un valore null diverso da String contenente "null" o NullPointerException.

Ma, come al solito, l'orientamento all'oggetto in soccorso. Crea una classe di valore come ho detto sopra. Ora aggiungi un metodo isNull() ad esso. Utilizzare questa classe di valori per qualsiasi valore per cui si desidera eseguire il dump del testo di debug.

Problemi correlati