0

ブール式を頻繁に評価する必要があったため、そのクラスのプライベート メソッドに変換しました。問題を引き起こしているコードは次のとおりです。

//"x", "y" and "team" are already defined
return (map.isWalkable(x,y) && 
    (!map.isOccupied(x,y) || map.getOccupant(x, y).getTeam() == team) );

この質問の目的に関しては、メソッドはかなり自明である必要があります。現在、isWalkable と isOccupied はどちらもブール値を返し、getOc​​cupant はオブジェクト参照を返す唯一のメソッドです。問題は、このコードを実行するときに NullPointerException が発生することです。 isOccupied は map.getOc​​cupant != null の場合にのみ true を返すため (これが実際にそのメソッドが返すものです)。したがって、左から右への遅延ブール値評価をサポートする言語では (Java がそうであるか、少なくともそれを読み取ることができたと思います)、getOc​​cupant メソッドは、null を返すときはいつでも実行されるべきではありません。

これは私が思っていたよりもコンパイラに依存していますか? if ステートメントを使用した方が安全な場合、または単にここに欠けている明らかな何かがある場合は、操作が逆に解決される可能性があります。

4

2 に答える 2

1

問題はあなたのかっこです。試す

return (map.isWalkable(x,y) && (!map.isOccupied(x,y) || map.getOccupant(x, y).getTeam() == team));
于 2013-08-07T13:11:06.560 に答える
1

簡単に言えば、いいえ、遅延評価は壊れていません。あなたのコードは. mapnull であるか、null を返しmap.getOccupant(x,y)ます。

それらを独自の行に置いてデバッガーで調べてみると、「ああ、私はとても愚かで、それに気付かなかった」ことに気付くでしょう。

コンパイラ、JVM、またはその他のものは、これとは何の関係もありません。

于 2013-08-07T13:10:11.683 に答える