0

我在一个名为 actor 的单独类中有一个名为“filmList”的 ArrayList,我想在 switch 中使用 case 2 来调用 newActor.filmList.get(i); 但我不断object may not be initialized从编译器收到错误。如果我将同一行放在 switch case 1 中它工作正常,但在 case 2 中我得到错误。有人可以告诉我如何从构造函数创建 newActor 对象的外部调用对象上的方法,我将永远感激不已,它正在努力工作,而我的讲师在解释事情方面很糟糕。谢谢。

public class ActorsMain {

public static void main(String[] args) {

    Scanner kb = new Scanner(System.in);

    String fName="";
    String lName="";
    String address="";
    int age;
    String filmEntry="";
    String code="";


    ArrayList actors = new ArrayList(); 
    ArrayList films = new ArrayList();
    int choice=0;
    while(choice!=3){
    System.out.println("Make your selection.\n1. Add Actor\n2. List Actors");
    choice=kb.nextInt();

    switch (choice){

    case 1:
            System.out.println("\nPlease enter the actors first name:");
            fName=kb.next();
            System.out.println("Please enter the actors second name:");
            lName=kb.next();
            System.out.println("Please enter the actors address:");
            address=kb.next();
            System.out.println("Please enter the actors age:");
            age=kb.nextInt();
            kb.nextLine();

            for(int a=0;a<10;a++){
            System.out.println("Please enter the actors film.\nType 'Stop' to stop entering films.");
            filmEntry=kb.nextLine();
            //kb.nextLine();
                if(filmEntry.equalsIgnoreCase("stop")){
                    break;
                }
                else {

                    Films filmObject = new Films(filmEntry,code);
                    films.add(filmObject);
                }
            }


            Actors newActor = new Actors(fName,lName,address,age);
            actors.add(newActor);

            newActor.setFilm(films);
            films.clear();
            break;

    case 2:

        break; 


    }
    }





}       

}

4

3 回答 3

0

您必须在 switch 语句的范围之外声明 newActor。在您的交换机的案例 2 中,newActor 不存在。

int c = 0;
switch (c) {
    case 1:
        Object obj = new Object();
        break;
    case 2:
        System.out.println(obj.toString()); // obj only exists in case 1
        break;
}

这实际上有点奇怪,也许其他人可以解释原因,但是您得到的错误似乎是 switch 语句特有的。如果您尝试执行以下操作:

int c = 0;
if (c == 1) {
    Object obj = new Object();
} else if (c == 2) {
    System.out.println(obj.toString());
}

你会得到一个不同的错误,上面写着“找不到符号”,这更重要。显然,交换机内的案例共享范围,以便它们可以“互相看到”。我认为这与 sans-break 失败有关。开关都是一个街区,箱子只决定入口点。

我不确定你想做什么来告诉你在哪里放置你的 newActor 声明,但现在关键是你的 switch 中的 case 2 不能使用它。它仅存在于案例 1 中。

此外,您不应该在这么长的语句中使用开关。您至少应该重构它,以便它使用 if 语句。开关不适合这种事情。它们适用于长条件,每种情况都有很多可能性和小语句:

char operator = '*';
int leftNumber = 5;
int rightNumber = 9;

switch (operator) {
    case '+': System.out.println(leftNumber + rightNumber);
              break;
    case '-': System.out.println(leftNumber - rightNumber);
              break;
    case '*': System.out.println(leftNumber * rightNumber);
              break;
    case '/': System.out.println(leftNumber / rightNumber);
              break;
    case '^': System.out.println(Math.pow(leftNumber, rightNumber));
              break;
    default:  System.out.println("Unknown operator");
}

作为一个长边说明,您没有将类型参数传递给您的 ArrayLists。Java 不知道您的 ArrayLists 包含演员和电影,除非您这么说:

ArrayList<Actors> actors = new ArrayList<Actors>();

ArrayLists 和其他泛型应该用括号中的参数初始化,<E>其中 E 是数组中元素的所需类类型。

类型参数有点像扩展一个类。ArrayList 类将在整个源代码中都有 E,当您将 Actor 传递给 E 参数时,E 将替换为 Actor。

class ArrayList<E> {
    Object[] array = new Object[some_length];
    public E get(int index) {
        return (E)array[index];
    }
}

变成

class ArrayList<Actor> {
    Object[] array = new Object[some_length];
    public Actor get(int index) {
        return (Actor)array[index];
    }
}

请注意,即便如此,由于泛型的实现方式,Java 是否知道 ArrayList 在应用程序运行时包含 Actors 仍然是模糊的。它们是使用称为擦除的东西来实现的。在运行时,无法知道 ArrayList 是否属于 Actor 类型。

如果您使用 type 参数声明它们,您将能够get()在您的代码中使用 Actors 和 Films 访问它们的元素,而您现在无法访问。

换句话说,您可以这样做:

System.out.println(actors.get(aIndex).filmList.get(fIndex));

看起来您开始尝试在案例 2 下执行此操作,但您目前也无法执行此操作。没有<Actor>,否则<Film>它会告诉您“找不到符号”或“不兼容的类型”,因为 ArrayList 包含一个没有类型参数的 Object 数组。(它仍然是一个带有 type 参数的 Object 数组,但您可以像传入的类型一样使用它。)

于 2013-10-22T01:10:58.843 回答
0

我猜你的 Actor 类有一个名为 filmList 的 ArrayList ,你想从它的某个位置获取值。如果是这种情况,您可能应该在您的 Actor 类中创建一个 getFilmListIndex(int pos) 方法,该方法接受一个索引值并返回您的电影列表存储的任何对象。假设您的 filmList 存储 String 它可能看起来像这样。

  public String getFilmListIndex(int pos)
      {
         return filmList.get(i);
      }

然后从您的 ActorMain 类中调用此方法。

  String result = newActor.getFilmListIndex(i);
于 2013-10-22T00:36:57.583 回答
0

age声明时未初始化。在情况 1 中,它将被设置,但在情况 2 中,尚不清楚它是否已设置。

您可以在声明它时为其分配一个虚拟值,但通常最好只在变量实际使用且具有有效值的情况下将其作用域

这建议将所有参与者详细信息放入一个单独的方法中或(不是那么好)在 {} 大括号内,并且仅在您分配值时声明它们。可以证明,让可访问的变量挂在未定义的、虚拟的或过时的值上,比只声明一个变量的范围等于它的值何时有效且适用时更不正确。

于 2013-10-22T00:39:48.607 回答