-1

/** There seems to be a problem with the intended method call from the performance class. The object is recognized as band but for some reason when i call band.begin() (band is the new performance object and begin its method) band is not recognized and it suggests it be initialized as a variable? */

import java.util.Scanner;


public class Music {

public static Instrument assignInstrument () {
    String instrumentChoice;
    String name;
    Scanner input = new Scanner (System.in);


    System.out.println("Select an instrument for the band member. ");
    System.out.print("Vocals, piccolo, Clarinet, Cymbal, or Drum: ");
    instrumentChoice = input.nextLine();
    System.out.print("Enter the band member's name: ");
    name = input.nextLine();
    if (instrumentChoice.equalsIgnoreCase("v")) {
        return (new Vocal(name));
    }   else if (instrumentChoice.equalsIgnoreCase("p")) {
        return (new Piccolo(name));
    }   else if (instrumentChoice.equalsIgnoreCase("cl")) {
        return (new Clarinet(name));
    }   else if (instrumentChoice.equalsIgnoreCase("cy")) {
        return (new Cymbal(name));
    }   else {
        return (new Drum(name));
    }
  }

/** I instantiated a "band" performance object but it is not recognizing it when i call its method... */
  public static void main (String [] args){
    Performance band; // band object instantiated
    Instrument bandmember1, bandmember2, bandmember3, bandmember4;
    Scanner input = new Scanner (System.in);
    String performanceChoice;

    bandmember1 = assignInstrument();
    bandmember2 = assignInstrument();
    bandmember3 = assignInstrument();
    bandmember4 = assignInstrument();
    System.out.println(bandmember1 + " " + bandmember2 + " " + bandmember3 + " " +     bandmember4 + "\n");

    System.out.print("Would you like to hear a solo, duet, trio, quartet, or leave?:  ");
    performanceChoice = input.nextLine();
    while (!performanceChoice.equalsIgnoreCase("l")) { // choosing the correct form of object
        if (performanceChoice.equalsIgnoreCase("s")) {
            band = new Performance (bandmember1);
        }   else if ( performanceChoice.equalsIgnoreCase("d")) {
            band = new Performance (bandmember1, bandmember2);
        }   else if ( performanceChoice.equalsIgnoreCase("q")) {
            band = new Performance (bandmember1, bandmember2, bandmember3);
        }   else {
            band = new Performance (bandmember1, bandmember2, bandmember3, bandmember4);
        }
    }
            band.Begin(); // error message: "variable band might not have been initialized".? 
 }
}


public class Performance {
private String arrangement;
private Instrument solo;
private Instrument duet_1, duet_2;
private Instrument trio_1, trio_2, trio_3;
private Instrument quart_1, quart_2, quart_3, quart_4;






public Performance (Instrument s) {
    solo = s;
    arrangement = solo.makeSound();
}

public Performance (Instrument d1, Instrument d2){
    duet_1 = d1;
    duet_2 = d2;
    arrangement = duet_1.makeSound() + duet_2.makeSound();
}

public Performance (Instrument t1, Instrument t2, Instrument t3){
    trio_1 = t1;
    trio_2 = t2;
    trio_3 = t3;
    arrangement = trio_1.makeSound() + trio_2.makeSound() + trio_3.makeSound();
}

public Performance (Instrument q1, Instrument q2, Instrument q3, Instrument q4){
    quart_1 = q1;
    quart_2 = q2;
    quart_3 = q3;
    quart_4 = q4;
    arrangement = quart_1.makeSound() + quart_2.makeSound() + quart_3.makeSound() + quart_4.makeSound();
}

public void Begin() {
    System.out.print(arrangement);
}

public String toString(){
    String program = "The performance includes ";
    program += arrangement;
    return program;
}
}
   /** Any suggestions? Thanks in advance*/
KamikazeStyle
  • 317
  • 2
  • 3
  • 10
  • Are you sure it's an error and not a warning? Your `while` loop is not guaranteed to run at least once. And if it runs it would never stop, since you do not update `performanceChoice` in it. – PM 77-1 Jun 03 '13 at 00:40
  • yea thats what i thought too so i was like screw it ill run it anyway but it was actually an error (63, 17) – KamikazeStyle Jun 03 '13 at 00:43
  • even if i change it to do that doesn't change its unrecognition as an object or method. it seems simple enough though. i even tried changing each band = new Performance""... to Performance band = new Performance"" but no avail :( – KamikazeStyle Jun 03 '13 at 00:46
  • duplicate of [variable-might-not-have-been-initialized-error](http://stackoverflow.com/questions/2448843/variable-might-not-have-been-initialized-error) – Brian Roach Jun 03 '13 at 00:47

1 Answers1

2

Change:

Performance band;

To:

Performance band = null;

This happens, since the compiler isn't sure the variable is ever assigned a value (if the while won't pass in first place). Although you could work with null values (resulting in NPEs in some cases), you can't work with unassigned values.

Recall, a global variable is automatically assigned to null, but not local variables.

Note this is true even if logically it must be assigned, for example in a try-catch block, you'll have to initialize and define ( probably null) before the try, in order to use it, since the compiler is not sure it will ever be assigned in the try, but rather catch an exception. Even if you call System.exit(1) in the catch block. That means, logically it must be defined (otherwise the program will terminate) but the compiler is not so smart ;)

Mordechai
  • 15,437
  • 2
  • 41
  • 82