【问题标题】:instantiated object's method won't run, error "variable(object's name) not initialized实例化对象的方法不会运行,错误“变量(对象名称)未初始化
【发布时间】:2013-06-03 00:33:47
【问题描述】:

/** 性能类的预期方法调用似乎有问题。该对象被识别为乐队,但由于某种原因,当我调用 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*/

【问题讨论】:

  • 您确定这是错误而不是警告吗?您的 while 循环不能保证至少运行一次。如果它运行它永远不会停止,因为你没有在其中更新performanceChoice
  • 是的,我也是这么想的,所以我就像搞砸了它无论如何都会运行它,但它实际上是一个错误 (63, 17)
  • 即使我将其更改为这样做也不会改变其作为对象或方法的无法识别。不过,这似乎很简单。我什至尝试将每个 band = new Performance""... 更改为 Performance band = new Performance"" 但无济于事:(

标签: java object instantiation


【解决方案1】:

变化:

Performance band;

收件人:

Performance band = null;

发生这种情况是因为编译器不确定变量是否被赋值(如果 while 不会首先传递)。虽然您可以使用空值(在某些情况下会导致 NPE),但您不能使用未分配的值。

回想一下,全局变量会自动分配给 null,而不是局部变量。

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

【讨论】:

  • 我从一本教科书上复制了它,该教科书旨在教授编程方式的权利。猜猜它不是那么好。
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 2014-11-01
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多