1

ifステートメントが適切に機能しない理由を見つけるのに苦労していたので、try catch代わりにブロックを使用しました。これは、私が持っていた if ステートメントです。

//selectArtistByName returns an Artist object
if (!selectArtistByName(artist.getName()).equals(artist.getName()) || 
    selectArtistByName(artist.getName())==null) {
    //save data to database
}

上記を実行すると、データベースが空だったNullPointerExceptionためにメソッドselectArtistByNameが返されたため、エラーが発生しました。null私が理解していないのは、if私が取得していたときにステートメントに入らなかった理由nullです。だから私はこれをやった、それはうまくいった:

try {
    if (!selectArtistByName(artist.getName()).equals(artist.getName())) {
    }
} catch (NullPointerException e) {
    m_db.insert(TABLE_ARTIST, null, artistContents);
}

私は Java の第一人者ではありませんが、私にとっては恐ろしい修正のように思えます。どうすればこれを修正できますか。

4

2 に答える 2

5

ifブロック内の条件の順序を変更するだけです:

if (selectArtistByName(artist.getName()) == null || 
   !selectArtistByName(artist.getName()).equals(artist.getName())) {
    //save data to database
}
  • 最初にnullチェックを行います。
  • それが成功した場合、2番目の条件は評価されないため、 no NullPointerException. これが、短絡 OR演算子のしくみです。最初の式がfalseと評価された場合、2番目の式のみが評価されます
  • null チェックが失敗した場合、2番目NPEの条件が評価されますが、最初の条件によって既に確認されているため、スローされません。

また、コメントで@ruakhが正しく指摘したように、あなたの状態は壊れているようです。はArtistselectArtistByNameを返しているように聞こえますが、これは とは比較できません。String

2番目の条件さえ必要ないと思います。selectArtistByName()メソッドはすでにnameの等価性チェックを行っており、それに基づいてArtistを返すと思います。selectArtistByNameそのメソッド returnを確認するnullだけで十分です。したがって、ifブロックを次のように変更する必要があります。

if (selectArtistByName(artist.getName()) == null) {
    //save data to database
}
于 2013-08-04T16:49:14.920 に答える
1

アーティストが不明な場合は、null 条件チェックを先頭に置くだけでショートカットできます。

if (selectArtistByName(artist.getName())==null || !selectArtistByName(artist.getName()).equals(artist.getName())) {
     //save data to database
}

遅延評価の詳細については、次の質問を参照してください: Java には遅延評価がありますか?

于 2013-08-04T16:53:33.137 に答える