需要有嵌套if的建议

时间:2015-10-31 00:37:38

标签: java

我尝试在以下代码中使用嵌套if。我已初始化变量,但编译器告诉我名为' bill'的变量。即使已经初始化也没有初始化。为什么编译器无法识别赋给变量的值?请参阅下面代码中的注释。

package killMe;

import java.util.Scanner;

public class Kill_Me {

static Scanner console = new Scanner(System.in);

    static double PREMIUM_SERVICE = 55.00;
    static double PREMIUM_DAY_OVERTIME_MIN = 0.20;
    static double PREMIUM_NIGHT_OVERTIME_MIN = 0.15;
    static double REGULAR_SERVICE = 30.00;
    static double REGULAR_OVERTIME_MIN = 0.40;

    public static void main(String[] args) {
        int acctNumber; 
        double premiumDayMin;
        double premiumNightMin;
        double bill;
        double minutes;
        String name;
        String premium = "PREMIUM";
        String regular = "REGULAR";

        System.out.println("What is the Account Number? ");
        acctNumber = console.nextInt();
        System.out.println("What is the Customer Name? ");
        name = console.next();
        System.out.println("Is the Service Code Premium or Regular? ");
        String strService = console.next();
        String strServiceCAP = strService.toUpperCase();


        if(strServiceCAP.compareTo(premium) == 0)
        {
                 System.out.println("How many Day Minutes were used? ");
                 premiumDayMin = console.nextDouble();
                 System.out.println("How many Night Minutes were used? ");
                 premiumNightMin = console.nextDouble();


                 if(premiumDayMin <0 && premiumNightMin <0)
                 {
                     System.out.println("Minutes cannot be less than 0 ");
                 }
                 else if(premiumDayMin <= 75 && premiumNightMin <= 100)
                 {
                     bill = PREMIUM_SERVICE;
                 }
                 else bill = PREMIUM_SERVICE + (premiumDayMin - 75) * PREMIUM_DAY_OVERTIME_MIN + (premiumNightMin - 100)
                         * PREMIUM_NIGHT_OVERTIME_MIN;

                 minutes = premiumDayMin + premiumNightMin;

                System.out.println("Customer Name:  " + name);
                System.out.println("Account Number:  " + acctNumber);
                System.out.println("Service Type:  " + strServiceCAP);
                System.out.println("Minutes Premium Service Used (Day):  " + premiumDayMin);
                System.out.println("Minutes Premium Service Used (Night):  " + premiumNightMin);
                System.out.println("Amount Due:  " + bill); // I get an error here stating, "The local variable 'bill' may not have been initialized". 
        }
        else if(strServiceCAP.compareTo(regular) == 0)
        {
                System.out.println("How many minutes were used? ");
                minutes = console.nextDouble();
                bill = REGULAR_SERVICE + (minutes - 50) * REGULAR_OVERTIME_MIN; 

                System.out.println("Customer Name:  " + name);
                System.out.println("Account Number:  " + acctNumber);
                System.out.println("Service Type:  " + strServiceCAP);
                System.out.println("Minutes Regular Service Used:  " + minutes);
                System.out.println("Amount Due:  " + bill); // I DO NOT receive an error message here. 


        }
        else
        {
            System.out.println("Invalid Service Type");
        }


    } // End of main

} // End of class

4 个答案:

答案 0 :(得分:1)

不,bill尚未在所有情况下初始化。

理解这一点:Java编译器永远不会评估布尔表达式;简化版:

double bill;

if (c1) {
    bill = v1;
} else if (c2) {
    bill = v2;
}

// try and use bill here

即使根据您的逻辑,布尔表达式c1c2可能涵盖所有可能的情况,编译器也无法确保这种情况。

这是您的错误的根本原因,无论您的if / else,switch等语句是否可能嵌套都很深。

答案 1 :(得分:0)

它们是else语句和变量声明的一些问题。     import java.util.Scanner;

class Main {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);   
double PREMIUM_SERVICE = 25.00;
double PREMIUM_DAY_OVERTIME_MIN = 0.10;
double PREMIUM_NIGHT_OVERTIME_MIN = 0.05;
double REGULAR_SERVICE = 10.00;
double REGULAR_OVERTIME_MIN = 0.20;



    int acctNumber; 
    double premiumDayMin;
    double premiumNightMin;
    double bill = 0.0;
    double minutes;
    String name;
    String premium = "PREMIUM";
    String regular = "REGULAR";

    System.out.println("What is the Account Number? ");
    acctNumber = console.nextInt();
    System.out.println("What is the Customer Name? ");
    name = console.next();
    System.out.println("Is the Service Code Premium or Regular? ");
    String strService = console.next();
    String strServiceCAP = strService.toUpperCase();


    if(strServiceCAP.compareTo(premium) == 0)
    {
             System.out.println("How many Day Minutes were used? ");
             premiumDayMin = console.nextDouble();
             System.out.println("How many Night Minutes were used? ");
             premiumNightMin = console.nextDouble();


             if(premiumDayMin <0 && premiumNightMin <0)
             {
                 System.out.println("Minutes cannot be less than 0 ");
             }
             else if(premiumDayMin <= 75 && premiumNightMin <= 100)
             {
                 bill = PREMIUM_SERVICE;
             }
             else 
             {
                 bill = PREMIUM_SERVICE + (premiumDayMin - 75) * PREMIUM_DAY_OVERTIME_MIN + (premiumNightMin - 100)
                     * PREMIUM_NIGHT_OVERTIME_MIN;
             }
             minutes = premiumDayMin + premiumNightMin;

            System.out.println("Customer Name:  " + name);
            System.out.println("Account Number:  " + acctNumber);
            System.out.println("Service Type:  " + strServiceCAP);
            System.out.println("Minutes Premium Service Used (Day):  " + premiumDayMin);
            System.out.println("Minutes Premium Service Used (Night):  " + premiumNightMin);
            System.out.println("Amount Due:  " + bill); // I get an error here stating, "The local variable 'bill' may not have been initialized". 
    }
    else if(strServiceCAP.compareTo(regular) == 0)
    {
            System.out.println("How many minutes were used? ");
            minutes = console.nextDouble();
            bill = REGULAR_SERVICE + (minutes - 50) * REGULAR_OVERTIME_MIN; 

            System.out.println("Customer Name:  " + name);
            System.out.println("Account Number:  " + acctNumber);
            System.out.println("Service Type:  " + strServiceCAP);
            System.out.println("Minutes Regular Service Used:  " + minutes);
            System.out.println("Amount Due:  " + bill); // I DO NOT receive an error message here. 


    }
    else
    {
        System.out.println("Invalid Service Type");
    }


} // End of main
}

答案 2 :(得分:0)

我不确定为什么会出现此错误,但在声明变量时尝试将bill初始化为0.00。

另外, if(premiumDayMin&lt; 0&amp;&amp; premiumNightMin&lt; 0)

应该改为

if(premiumDayMin&lt; 0 || premiumNightMin&lt; 0)

因为你想确保任何一分钟不小于零。你的程序应该可能会处理这个错误,因为程序的其余部分仍然执行。但也许你正在接受这个:-P。

答案 3 :(得分:0)

我不记得我做了什么来阻止收到错误消息(对不起)但我删除了代码if(premiumDayMin&lt; 0&amp;&amp; premiumNightMin&lt; 0)并将其替换为if(premiumDayMin&lt; = 75&amp;&amp; premiumNightMin&lt; = 100)以阻止代码冗余。这可能有固定的东西。如果要进一步清理逻辑,我还添加了另一个。