Boognish
Boognish

Reputation: 129

Need advice with nested if's

I have attempted using a nested if in the following code. I have initialized variables but the compiler is telling me that the variable named 'bill' is not initialized even though it has been. Why is the compiler not recognizing the value assigned to the variable? Please see the notes in the code below.

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

Upvotes: 0

Views: 66

Answers (4)

Boognish
Boognish

Reputation: 129

I don't recall what I did to stop getting an error message (sorry) but I removed the code if(premiumDayMin <0 && premiumNightMin <0) and replaced it with if(premiumDayMin <= 75 && premiumNightMin <= 100) to stop the code from being redundant. That may have fixed things. I also added another else if to clean the logic up further.

Upvotes: 0

Ryan Turnbull
Ryan Turnbull

Reputation: 3934

I'm not sure why it gets this error, but try initialising bill as 0.00 when you declare the variable.

Also, if(premiumDayMin <0 && premiumNightMin <0)

should probably be changed to

if(premiumDayMin <0 || premiumNightMin <0)

Because you want to make sure that either minutes is not less then zero. You're program should then probably handle this error, because the rest of the program still executes. But maybe you're getting on to that :-P.

Upvotes: 0

fge
fge

Reputation: 121702

No, bill has not been initialized in all cases.

Understand this: the Java compiler will never, ever, evaluate boolean expressions; Simplified version:

double bill;

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

// try and use bill here

Even if, according to your logic, boolean expressions c1 and c2 may cover all possible cases, the compiler cannot ensure that this is the case.

This is the root cause of your error, however deep your if/else, switch, etc statements may be nested.

Upvotes: 1

Marcin
Marcin

Reputation: 1494

They were some problems with else statement and variable declarations. 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
}

Upvotes: 0

Related Questions