2012-04-02 5 views
12

que tienen una función de Java llamado testForNull¿Hay alguna forma en Java para encontrar el nombre de la variable que se pasó a una función?

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

lo uso para probar varios objetos para asegurar que no son nulos. Pero, no puedo decir el nombre de la variable de esa manera.

Por ej. si digo

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

No puedo decir cuál de las tres líneas provocó la salida "El objeto es nulo". Por supuesto, puedo simplemente añadir otro parámetro a la función y tener algo como

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

Pero quiero saber si es posible deducir el nombre de la variable, sin pasar de forma explícita. Gracias.

+0

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

+2

No hay nada en el lenguaje para dar cuenta de esto. Sin embargo, imagino que podría hacerse con una herramienta de procesamiento adicional (por ejemplo, inspeccionar/modificar bytecode). Alternativamente, use una herramienta que pueda insertar las plantillas apropiadas autocompletadas con los valores coincidentes ;-) –

+3

su afirmación 'No puedo decir cuál de las tres líneas causó el resultado de' El objeto es nulo '.' solo es cierto en tu salida. Podría usar la nueva Excepción ("el objeto es nulo"). PrintStackTrace para averiguar exactamente dónde estaba, o podría usar un depurador y poner allí un punto de interrupción. Esto se parece más a algo que requiere un mejor registro, o un depurador, en lugar de una función de idioma. –

Respuesta

15

consideran que el parámetro no podría haber sido una variable (y por lo tanto no tendría un nombre):

testForNull(x != y); 
5

No, no hay tal manera. Tendrá que pasar explícitamente el nombre de la variable. Sin embargo, si su objeto tiene un campo 'nombre' o muestra su nombre a través de la función toString(), entonces eso podría ayudarlo.

+10

Es poco probable que un objeto muestre su nombre a través de toString() si es nulo ;-) –

+0

Es cierto. Sin embargo, 'testForNull()' (que prueba null) sabrá si debe mostrar 'null' o llamar' toString() 'del objeto. – Vincent

+0

@DonRoby tiene razón. El método toString() no me ayudará si el objeto es nulo. Por lo tanto, vencería mi propósito de descubrir qué objeto era nulo. – CodeBlue

1

Esto es lo que un depurador es para. No hay forma de hacer esto programáticamente. ¿Qué sucede si invoco testForNull(1 + 1)? ¿Cuál es el nombre de la variable entonces?

Eclipse tiene un depurador gráfico y fácil de usar para Java incorporado. Aprender a usar eso rendirá dividendos en el largo plazo, y pasa a ser la solución inmediata a su problema también.

+5

Bueno, los depuradores son un programa ... – Jeffrey

+0

Disculpe. "Programáticamente" como en "vía reflexión". Y como estamos siendo pedantes, los "depuradores ** son programas **". –

+0

Touché. Sin embargo, [este] (http://stackoverflow.com/a/744341/758280) responde a los enlaces a un marco de análisis de códigos de bytes que podría ser utilizado por Java para inspeccionarse en tiempo de ejecución. – Jeffrey

0

puede colocar la llamada al método en un foreach y establecer una ID de referencia para cada objeto que está pasando, incluso si devuelve nulo o no nulo para ese objeto específico.

-2

Java es un lenguaje orientado a objetos, por lo que la respuesta es "¡definitivamente!" puede decir el nombre de la variable pasada como parámetro. Para ello, intenta esto ...

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

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

Ahora bien, en sus métodos, que aceptaría todos los parámetros como ejemplos de valor, como en el siguiente método que aceptar sólo valores creados con las clases que tienen número como una clase base (que sería Long, Float, Double, etc) ...

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

¡Y eso es todo! Yo uso una clase genérica para que el valor puede ser utilizado para pasar en cualquier tipo - flotadores, Longs, Doble, BigInteger, String - por ejemplo ...

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

Además, el método anterior es simplemente un ejemplo - en practique cualquier método que acepte un valor podría acceder a su nombre.

¡Buena suerte y que todo tu código se compile sin problemas!

Rodney

+1

= b ¿Qué sucede si 'getNameOfParameter' recibe null como' parm1'? – frozenkoi

0

Sí, pero yo no lo recomendaría y sería excepcionalmente difícil.Trate assert lugar:

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

para hacer lo que desea, si usted tiene el código fuente, obtener el hilo actual http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#currentThread()

Obtener un seguimiento de la pila http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#getStackTrace()

Obtener el 2. ° al último elemento, el nombre de la clase, el nombre del archivo y el número de línea, luego imprima esa línea o analícela http://docs.oracle.com/javase/7/docs/api/java/lang/StackTraceElement.html#method_summary

0

Bah, después de ver el original qu de nuevo, no es un principiante.

La pregunta nos pide que podamos proporcionar un medio por el cual un valor pasado a un método CheckForNull() puede recuperar el nombre de los valores, y aquí está el kicker ... solo cuando el valor es nulo.

No hay forma de obtener nada a partir de un valor nulo que no sea una cadena que contenga "nulo" o una NullPointerException.

Pero, como de costumbre, la orientación del objeto al rescate. Crea una clase de valor como mencioné anteriormente. Ahora agregue un método isNull() a él. Utilice esta clase de valor para cualquier valor que desee vaciar el texto de depuración.

Cuestiones relacionadas