-1

ここでの問題は、if-else ブロックで使用してフィールド変数にする前に、 variable を定義する場所がわからないためwage、Eclipse で認識して使用できることです。

すぐ下のコードでは、コードの最後の行でエラーが発生しwageます。変数に解決できません。しかし、スキャナーコンソール行のすぐ下の別のコード行 (上から 4 行下) に配置すると、wageその下にある変数を含むコードのすべての行でエラーが発生し、「ローカル変数が重複しています」と表示されます。フィールド変数にするためにどこに配置すればよいかわかりません。アイデアはありますか?

import java.util.Scanner;

public class Java3 {
    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        System.out.println("*** Basic Wage Calculator ***");
        System.out.printf("%n");
        System.out.println("Enter start time in 24:00 format");
        String startTime = console.nextLine();
        String[] tokens = startTime.split(":");
        double starttimeHours = Double.parseDouble(tokens[0]);
        double startMinutes = Double.parseDouble(tokens[1]);
        if (starttimeHours >= 6 && starttimeHours <= 8
                || starttimeHours >= 9 && starttimeHours <= 19) {
            double wage = 1.6;
        } else if (starttimeHours >= 9 && starttimeHours >= 10 && startMinutes >= 01) {
            double wage = 43;
        } else {
            double wage = 987;
        }
        System.out.println(wage);
    }
}
4

4 に答える 4

1

double と書くと、ステートメントwage = 1.6;のスコープの変数を定義しています。ifつまり、if ステートメントの最後の}の後では、その変数にアクセスできません。if else ステートメントの外で賃金変数を定義します。startMinutesを定義した場所。割り当てる代わりに

   `double wage=1.6;`

への変更

   `wage=1.6;`  
于 2012-09-20T04:02:08.293 に答える
0

経由でアクセスしているため、 andwageの範囲外に移動する必要があります。ifelseSystem.out.println(wage)

import java.util.Scanner;

public class Java3 {
    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        System.out.println("*** Basic Wage Calculator ***");
        System.out.printf("%n");
        System.out.println("Enter start time in 24:00 format");
        String startTime = console.nextLine();
        String[] tokens = startTime.split(":");
        double starttimeHours = Double.parseDouble(tokens[0]);
        double startMinutes = Double.parseDouble(tokens[1]);
        double wage = 0;
        if (starttimeHours >= 6 && starttimeHours <= 8
                || starttimeHours >= 9 && starttimeHours <= 19) {
            wage = 1.6;
        } else if (starttimeHours >= 9 && starttimeHours >= 10 && startMinutes >= 01) {
            wage = 43;
        } else {
            wage = 987;
        }
        System.out.println(wage);
    }
}
于 2012-09-20T04:03:20.483 に答える
0

{}変数は、それが定義されているスコープ (のペア) で使用可能/使用できます。{}変数のスコープを拡大する必要がある場合は、次の方法でそれを行うことができるように、変数を外側に移動する必要があります。

double wage = 0.00;   // Moved wage outside the if-scope
if (starttimeHours >= 6 && starttimeHours <= 8
            || starttimeHours >= 9 && starttimeHours <= 19) {
    wage = 1.6;
} else if (starttimeHours >= 9 && starttimeHours >= 10 && startMinutes >= 01) {
    wage = 43;
} else {
    wage = 987;
}
于 2012-09-20T04:06:18.947 に答える
0

問題は範囲の 1 つです。スコープには、 loopmethod/block、およびclassの 3 つの異なるタイプがあります 。これらは、最も目立たないものから最も目に見えるものの順にリストされています。

マトリョーシカ人形のようなものと考えることができます。最小の人形はループの可視性であり、それらすべてを包含する人形はクラスの可視性です。より分かりやすく説明すると、次のようになります。

(Class Level
    (Method/Block Level
        (Loop Level)
     )
)

これらのスコープを多少混ぜ合わせることができますが、同じ一般的なスコープ規則が適用されます。

これはあなたの質問にどのように関係していますか? 私が言ったように、変数宣言の問題はスコープの 1 つです。変数wageを適切なスコープ レベルに移動し、一度だけインスタンス化します。


ループのスコープ内の 変数: ヘッダーまたはループの本体で宣言された変数は、ループに対してのみ排他的です。それらにアクセスしようとすると、コンパイル エラーが発生します。

for(int i = 0; i < 100; i++) {
    Double aValue = new Double(10.0);
    System.out.println(i);
}
aValue = 6; // What's this variable and why is it out here?
i = 0;  // Same as above

メソッド (またはブロック) のスコープ内の 変数: メソッドの本体またはコードのブロック (if ステートメントを含む) で宣言された変数は、ブロックに対してのみ排他的です。このブロック内部のループと if ステートメントは変数を操作できますが、上位のスコープ レベルから見えるように変数を宣言してインスタンス化することはできません。

public static void main(String[] args) {
    // args is a parameter that is also available in this scope!
    // the next two variables can be used anywhere in main
    // including the if-else and loops

    String name = "Makoto";
    Integer numPhones = new Integer(1);

    if(name.length() == 6) {
        String newWord = "Wow!"; //can't be used anywhere but here
        System.out.println(name + " " + newWord);
    } else {
        String oldWord = "bummer."; //can't be used anywhere but here
        System.out.println(name + " " + oldWord);
    }

    for(int i = 0; i < args.length; i++) {
        String word = "hello"; // can't be used in main()
        System.out.println(word + args[i]);
    }
}

クラス全体のスコープ内の変数 (一般にフィールド変数と呼ばれます): これらは、どのメソッドに含まれているかに関係なく、クラスで使用できる変数です。これに対する唯一の例外は静的メソッドです。静的フィールドを参照している場合は、静的メソッドから行う必要があります。

public class Dummy {
    private int weight;
    private int height;
    private int age;
    private int shape;
    private String name;
    private static boolean isSmart;

    public String getName() {
        return name;
    }

    public int getHeight() {
        return height;
    }

    public int getAge() {
        return age;
    }

    public int getShape() {
        return shape;
    }

    public static boolean getIsSmart() {
        return isSmart;
    }
}
于 2012-09-20T04:16:39.410 に答える