あなたの機能は、欠陥の数を持っています。
- あなたがやっています値の等価性チェックではなく、常にequalsメソッドを使用します。この種の欠陥に対してコンパイラエラーは発生しません。望ましくない出力。
- メソッド署名がvoidでないreturn文を示していても、関数内のすべてのコントロールフローにreturn文があるわけではありません。これにより、コンパイルエラーが発生します。これは、コード内に表示されているエラーです。
- 複数のリターンステートメントがあります。これはコンパイラエラーでもランタイムエラーでもありません。しかし、良いプログラミング実践の観点からは、複数のreturn文を持つことは最善の考えではありません。最後にフラグベースのreturn文を実行できます。
- コレクションオブジェクトから反復処理中に要素を削除しています。使用しているコレクション・オブジェクトのタイプによっては、実行時にConcurrentModificationException例外がスローされることがあります。可能であれば、フェールセーフイテレータを使用する必要があります。
あなたのプログラムを修正しようとしました。
public boolean deleteItem(String p) {
boolean itemFound = false;
//Assuming your myList object returns a fail safe iterator.
//If it returns a fail fast iterator instead, see the next option.
Iterator<String> iter = this.myList.iterator();
while(iter.hasNext()){
if(iter.next().equals(p)) {
iter.remove();
itemFound=true;
}
}
return itemFound;
}
イテレータがフェールセーフであれば、上記のプログラムは動作します。例えば。 myListオブジェクトの型がCopyOnWriteArrayListの場合、イテレータはフェイルセーフになります。しかし、あなたのmyListオブジェクトがそのような単純なArrayListのような型のものであれば、フェイル・ファスト・イテレータを返します。上記のメソッドはCMEを提供します。
あなたはmyListコレクションオブジェクトは、タイプリストの場合は、同じように簡単な何か試すことができます:あなたは、Java 8を使用している場合は、次のような何かを行うことができ、
public boolean deleteItem(String p) {
//removeAll will return true if at least 1 element is removed
return this.myList.removeAll(Collections.singletonList(p));
}
代わりに:
public boolean deleteItem(String p) {
//removeIf will return true if at least 1 element is removed
return this.myList.removeIf(item -> item != null && item.equals(p));
}
これはあなたに少し役立ちますように願っています。
出典
2016-04-11 00:28:39
VHS
elseブロックを削除し、forループの外側で 'return false;'を移動します。 –
@ Johnが言ったことと、 '.equals()'を使って文字列を比較します( '=='ではなく)。 – Bohemian
*デバッガ*を使用してください。私たちはあなたのデバッガーではありません。コードを実行すると、すぐにエラーが表示されます。 – Andreas