2012-03-28 11 views
0

をスキップしながらピンと私はそれを入力するものは、残りの部分をスキップし、私は別のトランザクションが欲しい場合は私に尋ねる。doループは、身体が最初に正常に動作しますが、それはそれは私が代わりに名前を入力することはできません必要がありますように、それがループするとき、それは最初の二つの文を印刷し、それを入力するように直進しながら、ループは私のDOで文

私は部分的に提出された配列オブジェクトを持っています。オブジェクト内の変数は、名前、ピン、口座番号、残高です。新しいオブジェクトを追加して残高を設定すると、新しい残高が入力されるため、前のオブジェクトの残高も同様に変更されます。私はそれが静的として宣言されてバランス変数とは何かがあると思うが、私はそれを静的にしないでください、私は "静的メソッドを静的メソッドをCustomerRecord型からwithdraw(double)にすることはできません"。 (解決済み)ありがとう。

public class BankCustomers 
{ 
public static void main(String[] args) 

    //------------------------------------------------ 
    //Part4: Find a customer record from anotherArray 
    //to do transaction(s) and update the record's balance 

    char repeat; // User control to repeat or quit 
    Scanner keyboard = new Scanner(System.in); //creating the scanner 

    String aName; 
    int aPin; 
    double aWithdraw; 
    double aDeposit; 

    do{ 


     //Read customer information before search 
     System.out.println(); 
     System.out.println("Lets make a transaction"); 
     System.out.println("Enter customer full name"); 
     aName = keyboard.nextLine(); 

     System.out.println("Enter Pin"); 
     aPin = keyboard.nextInt(); 


     //Search an Array for equal aName and aPin 
     for (int i = 0; i < index; i++) 
     { 
      CustomerRecord cRecord = anotherArray[i]; 
       if((cRecord.getName().equalsIgnoreCase(aName)) && (cRecord.getPin()   ==(aPin))) 
       { 
        System.out.println(cRecord); 

        System.out.println("Enter Withdraw Amount"); 
        aWithdraw = keyboard.nextDouble(); 
        CustomerRecord.withdraw(aWithdraw); 

        System.out.println("Enter Deposite Amount"); 
        aDeposit = keyboard.nextDouble(); 
        CustomerRecord.deposit(aDeposit); 
        System.out.println(cRecord);    
       }        
     } 


     System.out.println("\nAnother Transaction? (y for yes)"); 
     repeat = keyboard.next().charAt(0); 

    }while(repeat == 'y' || repeat == 'Y'); 

     //Print the records on screen 
    for (int i = 0; i < index; i++) 
     System.out.print(anotherArray[i]); 

    }       
+1

注意のために同様にその

cRecord.withdraw(aWithdraw); 

withdrawをインスタンスを使用して呼び出す必要があります:あなたのコードがあまりにも長いですbefor無関係な部分を排除することによって、問題を絞り込むようにしてください。コードを投稿します。これは私たちが問題をより簡単に見つけるのを助けるだけでなく、自分で問題を見つけて理解し、解決するのに役立ちます。 – Attila

+0

私の間違い。病気はそれを世話する。 – Batman

答えて

0

あなたの問題は二つある:

まず、balance istatic、それはクラスに関連付けられていることを意味する、そのインスタンス(オブジェクト)のいずれか、または他の用語では、すべての間で共有されていませんそのクラスのインスタンス

第2に、あなたが指摘したように、静的メソッドwithdrawbalanceにアクセスしています。静的に関する考慮事項も同様に適用されます。メソッドはクラスに関連付けられており、非静的なメンバーにはアクセスできません。第二の問題を解決withdraw宣言から静的を削除(および同様balanceから静的を削除するには

withdrawが今クラス自体が、それのインスタンスに関連付けられていないbecuase Thyisは、あなたのコードCustomerRecord.withdraw()がコンパイルされないようになります。だから、将来の投稿のためdeposit

+0

本当にありがとうございました。私は静的キーワードを削除し、インスタンスのレコードからの撤回を正しく呼び出すと、すべての静的な問題が修正されました。 – Batman

+0

これで、動作が正しいことを確認する必要があります:)(コンパイラが受け入れるものに関連する)構文上の問題を修正しただけで、他の意味(動作に関連するもの)は必要ありません...) – Attila

+0

実際うん、私はまだ私のdo whileループで問題を抱えています。何らかの理由でループが一旦止まったら、意図したとおりに動作を停止しました。最初はうまく動作し、別のトランザクションが必要かどうかを尋ねるときに「はい」と答えると、本体に戻り、最初の3つのステートメントが表示され、最初にピン名を尋ねるピンが尋ねられます。ピンに入ると、forステートメントをスキップして、もう一度やり続けるかどうかを尋ねます。これはwhileループを終了するまで続きます。 – Batman

2

あなたがこれらを呼び出すしようとしているとして、あなたがそれらを静的になりたくない

private static double balance 

public static void deposit(double aDeposit) 

public static void withdraw(double aWithdraw) 

から静的を削除します作成したオブジェクトから直接メソッドを取得し、したがって、それらはそれぞれCustomerRecordに固有のものになります。あなたのコード内で次に

、これらの行に変更:によって

CustomerRecord.deposit(aDeposit); 
CustomerRecord.withdraw(aDeposit); 

を:今、行った変更は、各CustomerRecordbalance変数にしていない単一balanceの変数に適用されます

cRecord.deposit(aDeposit); 
cRecord.withdraw(aDeposit); 

(ユニーク静的だったのと同じように)。

+0

これらから静的を削除すると、「非静的メソッドへの静的参照をCustomerRecord型から取り除くことができません」というエラーが表示されます。 – Batman

+0

@Batman更新された回答を参照してください。 – talnicolas

+0

ああ私はこれにも気づいた。ご助力ありがとうございます。しかし何らかの理由で私はdo whileループでまだ問題があります。プログラムを実行してトランザクションを実行すると、別のオプションを選択するオプションが与えられますが、プログラムは私にピンを入力するようにまっすぐに送ります。一度入力すると、他のものはスキップして、別のトランザクションを実行するかどうかを尋ねます:/ – Batman

1
public class CustomerRecord implements Serializable 
{ 
    private String name; 
    private int pin; 
    private int account; 
    private double balance; 
} 

public void deposit(double aDeposit) 
{ 
    balance = balance + aDeposit; 
} 

public void withdraw(double aWithdraw) 
{ 
    if (balance >= aWithdraw) balance = balance - aWithdraw; 
    else System.out.println("Withdraw cannot be negativeegative"); 
} 
  1. あなたが述べたように、balance非静的にします。これでバグが修正されます。
  2. だけでなく非静的CustomerRecord#deposit()#withdraw()方法を確認します。 #1によってコンパイルエラーが修正されます。
+0

CustomerRecord.deposit()と.withdraw()を非静的にする方法を教えてください。 – Batman

+0

気にしない、私は静的な問題を解決しました。ありがとうございました。間違ったオブジェクト名を使用していました。 CustomerRecord.withdrawではなくcRecord.withdrawである必要があります。ありがとうございました。 – Batman

+0

'static'キーワードを削除します。 –

1

あなたは問題があなたは物事が静的作られたということであることを正しいです。それらのすべてが特定の顧客レコードにではなく、同時に全ての顧客レコードに適用されるものであるためbalancedepositwithdrawはいずれも静的であるべきではありません。

コードを静的にしないとコードが機能しないという事実は、withdrawメソッドを呼び出す方法に関係します:CustomerRecord.withdraw(aWithdraw)。あなたの注意がそれに引き寄せられたので、何が間違っているのを見ることができますか? CustomerRecordのためのあなたのインスタンス変数で

+0

オハイオ州、クラスを参照していましたが、オブジェクト名はcRecordではありませんでした。私はcRecord.withdraw(aWithdraw)に変更し、静的な問題を修正しました。あなたはこれもまたあなたが言いましたか? – Batman

+0

よくやった! –

1

あなたはbalanceは静的変数として宣言されています。

これは、いつでもあなたはそれがすべてのインスタンスに変更されることクラスの1つのインスタンスでbalanceを変更することを意味します。たとえば、預金と引き出しの方法。

これらの2つのメソッドを動作させるためにバランスをとる必要があると仮定していますが、静的宣言を3つすべて取り除くだけです。次に、あなただけの静的クラスではなく、クラスのインスタンスを使用する

CustomerRecord.withdraw(); 
CustomerRecord.deposit(); 

からすべてのコールを変更する必要があります。だから、

// Whatever values you want here, you seem to have 4 already declared so you can use those 
CustomerRecord c = new CustomerRecord("", 0, 0, 0); 

c.withdraw(); 
c.deposit(); 
+0

申し訳ありませんが、 'CustomerRecord c = new CustomerRecord( ""、0、0、0);' forループに書かれていますか?どちらの方法でも、CustomerRecord.classには、引数が特定の値を満たしていないとエラーを返すifステートメントがあるため動作しません。だから私はパラメータを設定せずにオブジェクトを作成しようとしましたが、まだエラーが発生します。 – Batman

+0

私の解決策が不明だった、ごめんなさい。基本的には、ユーザーが指定した値を使用して、どこかでCustomerRecordのインスタンスを作成する必要があります。 CustomerRecordのコンストラクターは、それらのインスタンス変数が渡されるとそれらのインスタンス変数を初期化する必要があります。 –

+0

私はこの行の対象はここ 'CustomerRecord cRecord = anotherArray [i];'私は間違ってキー名(cRecord)を与えたということは、私が間違ってクラス名(CustomerRecord)を使用してオブジェクト名(cRecord)を使用してメソッドを呼び出すことだったということです。これは私の静的な問題を修正しました。今私はdo whileループが制御不能である理由を理解しようとしています。静的な問題の支援をありがとう。 – Batman

関連する問題

 関連する問題