public void clearTrash()
{
for (Email i1 : trash.getEmails()) trash.removeEmail(trash.getEmails().indexOf(i1));
}
繰り返し処理するものが何もないため、trash.getEmails() が空の場合、これは単純に返されると思いましたが、空のフォルダーでデバッグすると NullPointerException がスローされます。なぜそれがうまくいかないのですか?
public void clearTrash()
{
for (Email i1 : trash.getEmails()) trash.removeEmail(trash.getEmails().indexOf(i1));
}
繰り返し処理するものが何もないため、trash.getEmails() が空の場合、これは単純に返されると思いましたが、空のフォルダーでデバッグすると NullPointerException がスローされます。なぜそれがうまくいかないのですか?
foreach
このループの背後にあるロジックが何であるかはわかりませんがIterator
、反復中にアイテムを削除するために使用することをお勧めします。
Iterator<Email> it = trash.iterator();
while (it.hasNext()) {
// some logic ....
it.remove();
}
あなたのNPEに関しては、おそらくtrash
または多分trash.getEmails()
nullです。nullをチェックしてください!
org.apache.commons.collections.CollectionUtilsを使用する
if(CollectionUtils.isNotEmpty(trash.getEmails()){
//Your logic.
}
isNotEmpty() は、空のリストだけでなく null もチェックします。
あなたのtrash
varがそうであるnull
か、リストtrash.getEmails()
がnullです
だからあなたがそれを使うとき、そのような
for(Email i1 : null)
リストを使用する前に、リストを評価することに慣れるようにしてください。
if (trash != null) {
//some logic here...
if (trash.getEmails() != null) {
for(Email i1 : null) {
//your code...
}
}
}
また、補足として、すべての要素を削除するのではなく、新しいリストを作成する方がパフォーマンスが向上します。
//deleting the items in the List<Email>
//maybe the collection is not List, just a supposition, still the idea is the same
trash.setEmails(new List<Email>);
コードには常に防御的プログラミングを組み込みます。
オブジェクトがどこにあるとしても、null の場合はどうするか、null でない場合はどうするかを考えてください。
以下のように実装できます。
if(object==null){
//doSomething()
}else{
//doSomethingElse()
}
ごみ箱が null かどうかを確認します。