1
public void returnRental(Customer cust){
    Rental toDelete = null; //Rental to be removed from list.
    LinkedList<Video> toReturn = null; //List of videos to be added to inventory.

    //Find appropriate rental according to customer name. 
    for(int i = 0; i < rentals.size(); i++){
        if(cust.getName() == rentals.get(i).getRentee().getName()){
            toReturn = rentals.get(i).getRented();
            toDelete = rentals.get(i);
        }
    }

ここに問題を引き起こしているコードのスニペットがあります。私はそれをEclipseでかなりデバッグしましたが、それは私をさらに混乱させました。if にヒットし、条件を渡します。しかし、「toReturn」に値を割り当てると、サイズ 0 の空のリストが割り当てられます。レンタルを確認すると、リンクされたリストと正しい値が存在しますが、何らかの理由で変数に正しく割り当てられません。 (「toDelete」にも同じことが起こりますが、これはリストではなく、私のクラス Rental の 1 つのインスタンスです。(リンクされたリストは、ビデオのリンクされたリストを含むレンタルのリストです)

エラーはスローされません...説明するのが少し難しいです。さらに情報が必要な場合はお知らせください。明確にします。

おそらく、リンクされたリストを正しく反復処理していないために、途方に暮れていますか?

4

4 に答える 4

3

交換

if (cust.getName() == rentals.get(i).getRentee().getName()){

if (cust.getName().equals(rentals.get(i).getRentee().getName())){

文字列を比較することはできません==(アルゴリズムがこれが同じインスタンスであることを保証できる場合を除きますが、これはほとんどありません)。

しかし、欠落equalsは唯一のバグではありません。内部または他の場所にある可能性があります(とgetRented()で何をするかを示していないため、ここで問題がないかどうかは明確ではありません)。toReturntoDelete

さて、バグの追跡を続けるには、次のいずれかを行う必要があります

  • デバッグし、ループにブレークポイントを配置して、rentals.get(i)この時点での状態と実行を確認します
  • デバッグできない場合は、多くの System.println を配置して、何があるかを確認してください...
于 2012-10-01T19:44:04.910 に答える
1

おそらく、あなたのif状態は複数回ヒットしています。まずは、これが実際に起こっているかどうかを確認してください。その場合は、ロジックを確認して、最初に停止するか最後に停止するかを決定します (この場合は後者のようです)。

最初の出現で停止したい場合は、反復を中断します。

for(int i = 0; i < rentals.size(); i++){
    if(cust.getName() == rentals.get(i).getRentee().getName()){
        toReturn = rentals.get(i).getRented();
        toDelete = rentals.get(i);
        break;
    }
}
于 2012-10-01T19:55:18.133 に答える
1

誤った文字列比較は常に間違っているため、dystroy の回答に賛成票を投じました。

しかし、それは別の方法で失敗する可能性があるため (顧客名が賃借人の名前と一致しない)、あなたの問題が本当に次のいずれかによって引き起こされているかどうか疑問に思っています:

  1. の問題getRented()です。また
  2. 呼び出し時に null 名を持つ cust。これは、null 名を持つ Rentee と一致します。
于 2012-10-01T20:03:21.670 に答える
0
for(int i = 0; i < rentals.size(); i++){ 
    if(cust.getName().equals( rentals.get(i).getRentee().getName())){ 
        toReturn.addAll(rentals.get(i).getRented());  
         //assumming it returns the list of Video object
        toDelete = rentals.get(i); 
    } 
} 
于 2012-10-01T20:18:27.360 に答える