2011-01-14 5 views
0

Derzeit Debuggen, und fand eine If-Anweisung, die für keine (ich dachte ...) Grund gab mir eine NPE, offensichtlich aus einem Grund. Was zu sein schien, war die Aussage if(false && (null != null || null != Color)).null! = Null - irgendwelche Ideen, wie man den Code neu anordnet oder verhindert?

if(destination != null && (destination.getPiece() != null || destination.getPiece().getColour() != pieceColour)) - die if-Anweisung

Beide Ziel null sein kann und ein Stück kann sein. Die Methode getColour() gibt ein Attribut vom Typ Color from piece zurück, das null sein muss, wenn das Stück null ist. Das Stück am Ziel hat ein anderes Stück-Attribut als dasjenige in der if-Anweisung.

Insbesondere, wie neu anordnen (destination.getPiece()! = Null)?

+0

Sorry Leute, ich war falsch. An der Stelle, an der diese if-Anweisung war, kann das Ziel auch null sein. Gemischte Dinge ein wenig. So ist das Entfernen der Ziel-Null-Überprüfung unmöglich. Mein Fehler. –

Antwort

3

Die Logik im zweiten Teil der Aussage ist sehr verwirrt.

getPiece().getColour() ist nicht gültig, wenn getPiece() null ist und umgekehrt.

Mit anderen Worten, destination.getPiece() == null => destination.getPiece().getColour() ist ein NPE. Ebenso destination.getPiece().getColour() ist etwas =>destination.getPiece() != null

Nur, was macht Sinn für mich ist:

if(destination != null && (destination.getPiece() == null || destination.getPiece().getColour() != pieceColour)) 

Das heißt, ist das Ziel nicht null ist, und entweder das Stück ist null oder eine andere Farbe .

+0

Ja, dass überprüfen Klingt richtig, es wird chaotisch, wenn viele If-Statements in Betracht kommen :) –

2

Andere Antworten arbeiten, aber aus Gründen der Klarheit würde ich vorschlagen, das Ergebnis destination.getPiece() in einer lokalen Variablen speichern:

if (destination != null) 
{ 
    Piece piece = destination.getPiece(); 

    if (piece == null || piece.getColour() != pieceColour)) 
    { 
     // Do stuff. 
    } 
} 
+0

Entschuldigung, überprüfe meine Änderung! –

0
destination.getPiece() != null || destination.getPiece().getColour() != pieceColour 

werden soll:

destination.getPiece() != null && destination.getPiece().getColour() != pieceColour 
+0

Entschuldigung, überprüfe meine Bearbeitung! –

1
Object obj = destination.getPiece(); 

wenn obj is null dann (obj! = null) gibt false zurück, aber beim Überprüfen von obj.getColor() wird ausgelöst NullPointerException. Deshalb sollte es so sein:

if(destination != null && (destination.getPiece() != null && destination.getPiece().getColour() != pieceColour)) 
+0

Aber wird getColour() nicht auch dort eine NullPointerException auslösen? Wir überprüfen immer noch, ob getColour()! = PieceColour –

+0

wenn obj ist nicht null dann obj.getColour() wird nicht werfen NPE es einfach zurück null, wenn nicht und es gibt kein Problem, weil Sie die Gleichheit mit! = –

1

Die einfachste Antwort wäre dies in zwei, wenn Aussagen zu spalten:

if(destination != NULL) 
{ 
    if(destination.getPiece() != null || destination.getPiece().getColour() != pieceColour) 
    { 
    //Do stuff 
    } 
} 
Verwandte Themen