2013-06-03 43 views
-1

/**有似乎是从性能类预期的方法调用的一个问题。该对象被认为是乐队,但由于某些原因,当我打电话band.begin()(带是新的性能对象,并开始它的方法)频带不被识别,它表明,它被作为一个变量初始化*/实例化对象的方法将无法运行,错误“变量(对象的名字)没有初始化

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*/ 
+0

你确定这是一个错误,而不是警告?您的'while'循环不保证至少运行一次。如果它运行它永远不会停止,因为你不更新'performanceChoice'。 –

+0

是啊,这就是我的想法太让我喜欢它拧带病运行也无妨,但即使我改变它做到这一点不会改变其作为unrecognition对象或者方法,它实际上是一个错误(63,17) – KamikazeStyle

+0

。它似乎很简单,虽然。我甚至试图改变每个波段=新的业绩“” ......以性能等级=新的业绩“”,但无济于事:( – KamikazeStyle

回答

2

变化:?

Performance band; 

收件人:

Performance band = null; 

出现这种情况,因为编译器是不知道的变量曾经分配一个值(如果同时不会在首位通过)。尽管您可以使用空值(在某些情况下导致NPE),但您无法使用未分配的值。

回想一下,有一个全局变量自动分配给空,而不是局部变量。

注意,这是正确的,即使在逻辑上必须分配,例如在try-catch块,你必须初始化try之前定义(可能null),为了使用它,因为编译器不确定它会在try中被分配,而是捕获一个异常。即使您在catch区块中拨打System.exit(1)也是如此。这意味着,在逻辑上它必须被定义(否则程序将终止),但编译器不是所以智能;)

+0

完美。非常感谢你 – KamikazeStyle

+0

我复制它从课本多数民众赞成想教给的方法来计划的权利。猜猜它不太好。 – KamikazeStyle