0

クラスの「大学書店」のプログラムを書いています。すべてが機能しているように感じますが、publishingPrice とマークアップについては、「変数が初期化されていません」というエラーが表示されます。それでも、私は彼らに両方の価値を与えました。私は何を間違っていますか?私はネットビーンズを使用しています。

import java.util.Scanner;
public class ProgrammingProject {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        //Set my variables for the program
        double publisherPrice;
        double newBook;
        double usedBook;
        double usedBookDiscount;
        double rentalBook;
        double rentalBookDiscount;
        double markup;
        int booksOrdered;

        String bookName;

        System.out.println("Enter the Book Title: ");
        bookName = keyboard.next();


        System.out.println("Enter the Amount of Books Ordered: ");
        booksOrdered = keyboard.nextInt();

                //Set the conditions for markup
        if (booksOrdered < 20) {
            markup = .40;
                    }
        if (booksOrdered >= 20 && booksOrdered < 50){
            markup = .35;
                    }
        if (booksOrdered >= 50 && booksOrdered < 100){
            markup = .30;
                    }
        if (booksOrdered >=100){
            markup = .25;
        }



        //Set calculations for program to use

        usedBookDiscount = .75;
        rentalBookDiscount = .40;
        newBook = (publisherPrice + markup);
        usedBook = ((newBook * usedBookDiscount) - usedBookDiscount);
        rentalBook = ((newBook * rentalBookDiscount - rentalBookDiscount));

        System.out.println(bookName + publisherPrice + newBook + usedBook + rentalBook);



                }
}
4

2 に答える 2

2

ステートメントmarkup内でのみ値を割り当てます。ifコンパイラーは、何が実現可能か、およびすべてのケースをカバーしたかどうかを追跡しません...そのため、コンパイラーに関する限り、変数はまだ確実に割り当てられていません。

最も簡単な修正は、else代わりに使用することです。

if (booksOrdered < 20) {
    markup = .40;
} else if (booksOrdered < 50) {
    markup = .35;
} else if (booksOrdered < 100) {
    markup = .30;     
} else {
    markup = .25;
}

finalelseは無条件であるため、コンパイラは、このコードを通るすべてのパスが に値を割り当てることを検出しmarkupます。

-にはこれで十分ですmarkupが、 に値を代入するものは何も指定していませんpublisherPrice。それは、より多くのユーザー入力によって設定されることを意味していましたか? メソッドの開始時にすべてを宣言してから値を割り当てるのではなく、宣言の時点で変数に値を割り当てると、これらすべてを簡単に見つけることができることに注意してください。

たとえば、これの代わりに:

String bookName;

System.out.println("Enter the Book Title: ");
bookName = keyboard.next();

... あなたが持つことができます:

System.out.println("Enter the Book Title: ");
String bookName = keyboard.next();

別の注意点として、通常はdouble金銭的な金額には使用しないでくださいBigDecimal。代わりに使用することを検討してください。

于 2013-09-21T20:09:53.713 に答える
1

算術演算を実行する前に、すべての変数を値で初期化する必要があります。

于 2013-09-21T20:10:18.550 に答える