0

ユーザーが入力した値が現在の配列に既に存在するかどうかを判断しようとしていますが、その方法は?

変数が accnoであり、比較対象の配列 がaccnumsであることを確認するためにユーザーが入力した値

これは私が現在取り組んでいるものです

public class Randomtopic {

    static BigDecimal[] accbal = new BigDecimal[20];
    static Integer[] accnums = new Integer[20];

    public static void main(String[] args) {
        displayMenu();
    }

    public static void displayMenu() {
        int option, accno;
        double accbal;
        Scanner sc = new Scanner(System.in);
        System.out.println(" Add an account");
        System.out.println("Search an account with the given account number");
        System.out.print("Enter Your Choice: ");
        option = sc.nextInt();
        switch (option) {
            case 1:
                System.out.println("You have choosen to add account");
                addAccount();
                break;
            case 2:
                System.out.println("You have choosen to search for an account");
                System.out.print("Enter the Account Number: ");
                accno = sc.nextInt();
                System.out.println(search(accno, accnums));
                break;
            default:
                System.out.println("Please choose an appropriate option as displayed");
        }
        displayMenu();
    }

    public static void addAccount() {
        //String accno;
        int i = 0;
        int accno, input;
        BigDecimal accbala;
        DecimalFormat df = new DecimalFormat("0.00");
        //BigDecimal[] accbal= new BigDecimal[20];
        Scanner sc = new Scanner(System.in);
        //String[] accnums = new String[20];
        int j;
        System.out.print("Enter the account number: ");
        accno = sc.nextInt();
        if (String.valueOf(accno).matches("[0-9]{7}")) {
            System.out.print("Enter account balance: ");
            accbala = sc.nextBigDecimal();
            for (j = 0; j < accnums.length; j++) {
                if (accnums[j] == null )
             break;
         else if(accnums[j].equals(accno))
         {
              System.out.println("Account already exists");
         }
            }
            //System.out.print(j);
            if (j == accnums.length) {
                System.out.print("Account storage limit has reached.");

            } else {

                    accnums[j] = accno;
                    accbala = accbala.setScale(2, RoundingMode.HALF_UP);
                    accbal[j] = accbala;

            }
            input = accnums[0];
            System.out.println("The value: " + input + " witha a balance of " + accbal[0].toString());
        } else {
            System.out.println("Wrong NRIC");
        }
        displayMenu();
    }

    public static String search(int accnum, Integer[] numbers) {
        // Integer[] numbers;
        //int key;
        //numbers = accnums;
        // System.out.print("Enter the Account Number: ");        
        for (int index = 0; index < numbers.length; index++) {
            if (numbers[index].equals(accnum)) {
                return String.valueOf(index);
                // System.out.println("The account number exists in this array index :"+index);//We found it!!!
            }
            break;
        }
        return "-1";
    }
}

だから私の問題?初めて accnum に入ると、NullPointerException が発生します。Tks

4

5 に答える 5

0

私があなたのコードを正しく理解した場合、あなたは口座番号によって識別される関連する残高を持つ多くの口座を持っています。この場合、配列をいじる代わりにマップを使用します。

于 2012-08-23T08:19:27.503 に答える
0

あなたaccnumsは価値で満たされていnullます。そうでないかどうかを確認しnullます。メソッドNullPointerExceptionからスローされたと思います。search

于 2012-08-23T08:11:23.083 に答える
0

メソッド検索を初めて実行すると、あなたの配列accnumsはnull値で満たされるため、行if ( numbers[index].equals(accnum))を呼び出すときにnullオブジェクトでequalメソッドを呼び出そうとして います。配列からリストに

変更すると、サイズは要素数に依存しますaccnums、したがって、配列のようにサイズが固定されません

于 2012-08-23T08:23:14.270 に答える
0

配列をインスタンス化または作成すると、値はデフォルトで null に設定されます。null 値の可能性がある配列を反復するときはいつでも、これらをスキップする必要があります。例えば、

for(loop conditions)
        if (numbers[index] != null && (numbers[index].equals(accnum))) {
            return String.valueOf(index);
            //your text goes here;
        }
        break;//I suggest you take this line out of your original code. Your for loop will end this once you have iterated through the entire array, or you will automatically break out if you find the value.
}

配列を使用する必要がある場合は、これが配列を反復処理する最良の方法です。if 句の括弧と && により、numbers[index] == null の値であるかどうかの .equals チェックを実行できなくなり、null エラーがスローされなくなります。唯一の代替手段は、numbers[ ] のすべての値を 0 またはその他の値に設定し、反復時にその値をスキップすることです。これは static final int で行われます。ただし、これは理想的なコーディングではありません。

理想的には、ArrayList を使用する必要があります。これにより、これをより効率的にするだけでなく、読みやすくすることもできます。

于 2012-08-23T17:20:04.153 に答える
0

検索しているaccnumに何も追加せずにコードに問題があるため、accnumにはNULL値が含まれています。accnum配列をリスト/ハッシュマップに変更すると、例外は発生しません。

于 2012-08-23T08:42:48.683 に答える