2009-11-29 31 views
15

pensé Java tenía evaluación de cortocircuito, sin embargo, esta línea todavía está lanzando un nulo excepción de puntero:Java cortocircuito evaluación

if((perfectAgent != null) && (perfectAgent.getAddress().equals(entry.getKey()))) { 

En este caso perfectAgent es null, así que sólo quiero toda la expresión para volver false , pero mi aplicación todavía se cuelga en esta línea con una NullPointerException.

EDITAR, respuesta general:

Desde perfectAgent es null, nada a la derecha de la && debe ser ejecutado, ya que es imposible que la expresión sea verdadera. Más al punto, es imposible ejecutar perfectAgent.getAddress() ya que perfectAgent no contiene una referencia válida (es nulo y todo). Estoy tratando de usar la evaluación de cortocircuito para no tener que comprobar nulo en una declaración separada ya que eso hace que la lógica sea más descuidada.

EDIT 2 (o, que soy un idiota): Sí, como muchas cosas en la vida a averiguar la respuesta correcta después de anunciar al mundo que usted es un idiota. En este caso, apagué el autobuild de Eclipse mientras hacía otra cosa y no lo volví a encender, así que estaba depurando archivos de clase que no coincidían con mi fuente.

+6

¿Ha comprobado que la entrada no es nula? –

+0

La entrada no es nula. – Donnie

+1

Si 'perfectAgent' es' null', de hecho, el resto de esa línea no debería ejecutarse. No ve ningún problema con él como lo está ahora:/ – Joey

Respuesta

4

avanzada lección de depuración # 1:

Si surge un error aparentemente imposible (por ejemplo, uno que contradice que el conocimiento acerca de Java), haga lo siguiente:

  • consultar a un texto de buena reputación reserve (o mejor aún, el estándar relevante) para confirmar que su comprensión no es defectuosa. (En este caso su comprensión era correcta, y cualquier libro de texto medio decente lo confirmaría en un minuto.)

  • Compruebe todas las cosas estúpidas que podría haber hecho que podrían causar el error imposible.Cosas como no guardar un archivo, no hacer una compilación completa, ejecutar una versión vieja/obsoleta de la aplicación, estar en el directorio incorrecto, y así sucesivamente.

En resumen, aprende a dudar un poco más.

2

se asegura de que perfectAgent no es nula, por lo que uno o más de perfectAgent.getAddress() o entry o entry.getKey() debe ser nulo. O getAddress() o getKey() están golpeando un NPE en su implementación.

Para depurar este tipo de cosas, observe primero el trazado de la pila para fijar la ubicación. Esto le diría si está sucediendo en getAddress() o en getKey() o en el fragmento de código pegado que los llama. A continuación, si está en este fragmento, agregue un código antes de la prueba if, que es nulo. Puede usar el antiguo y viejo System.err.println() o assertions. (Si utiliza afirmaciones, asegúrese que les permita con la bandera -enableassertions del comando java.)

Actualización: Así que mi interpretación resultó ser incorrecto ... el problema presenta dos hechos contradictorios (hubo un NPE en esta línea y, sin embargo, el cortocircuito debería haber sucedido) y automáticamente asumí que el primer hecho era cierto y el segundo falso cuando en realidad era un problema completamente diferente debido a la desactivación de la construcción automática en Eclipse. Duh! Al depurar algo "imposible", ayuda a ser radicalmente escéptico.

7

Java tiene tienen evaluación de cortocircuito. Tal vez entry es null y entry.getKey() está causando el NullPointerException. Otra posibilidad es que getAddress() devuelva null o tenga un NullPointerException sucediendo en algún lugar (si es más complicado que una simple declaración return).

EDIT: Veo que su texto en el que solicita esta:

Más al punto, es imposible ejecutar perfectAgent.getAddress() ...

Pero lo que si perfectAgent.getAddress() se ha ejecutado con éxito y devuelvenull? Mira lo que quiero decir ...

0

Hay tres referencias distintas de perfectAgent que podrían ser nulo:

  • perfectAgent.getAddress()
  • entrada
  • entry.getKey()

romper el estado de cuenta o ejecutarlo en un depurador.

+0

'entry.getKey()' siendo nulo no daría como resultado 'NullPointerException' en el fragmento de código de OP. – Asaph

+0

Object.equals (null) devuelve false siempre. Entonces no sería entry.getKey() retornando nulo. Entonces debe ser uno de los primeros dos listados. –

+0

Ah sí, ambos son correctos. Solo los primeros dos son candidatos. –

10

Si perfectAgent es realmente nulo, que el código no se lanzar una excepción (al menos suponiendo que no son extraños cosas roscado pasando, cambiándolo de no nulo a nulo a mitad de camino a través de la expresión). Me sorprendería completamente si pudiera producir un programa breve pero completo que lo demostrara.

Así que sí, su intuición es correcta, esto no debería ser un problema. Busca en otra parte la causa. Sospecho que perfectAgentrealmente no es realmente nulo, y que se está ejecutando en cualquiera de las otras situaciones en ese código que podría causar una excepción.

Le sugiero que intente extraer ese fragmento de código en un ejemplo breve pero completo; si puede hacerlo, me comeré mi sombrero metafórico; si no, con suerte encontrará el problema mientras intenta la extracción.

¿Qué hace que piense que perfectAgent realmente es null? Trate de insertar el código antes de que:

if (perfectAgent == null) 
{ 
    System.out.println("Yup, it's null"); 
} 

Otra posibilidad muy, muy delgada, es que le han acabado en un error JIT - pero yo lo dudo.

+0

Oh, sí, no pensé que era un error JIT, solo estaba tratando de descubrir qué hice mal. – Donnie

+0

No hizo nada incorrecto en el código que ha mostrado, al menos nada que podría causar esto. Sospecho que es algo en lo que te lleva a creer que perfectAgent es nulo :) –

+0

Ver mi Edit2. Justo en la nariz. – Donnie

1

Gran misterio. Copié su línea de código y probé con perfectAgent == null, entry == null, entry.getKey() == null y combinaciones de las siguientes: No NPE en mi banco de pruebas (Java 1.6).

Sea cual sea el error molesto, dudo que tenga algo que ver con la evaluación de cortocircuitos. Si es esta línea la que causa NPE, entonces, por lo que puedo decir, perfectAgent no es nulo. Buena suerte y - nos muestran el error una vez que haya atrapó :)

0

intente formatear el código de la siguiente manera:

if( 
    (perfectAgent != null) 
    && (
     perfectAgent.getAddress() 
     .equals(
     entry.getKey() 
    ) 
    ) 
) { 

Se le debe dar una mejor entrada de línea de seguimiento de la pila.

Cuestiones relacionadas