Java 当对象不在创建对象的范围内时,如何对其调用方法

Java 当对象不在创建对象的范围内时,如何对其调用方法,java,object,methods,invocation,Java,Object,Methods,Invocation,在另一个名为actors的类中,我有一个名为“filmList”的ArrayList,我想在切换中使用案例2来调用newActor.filmList.get(I);但我不断从编译器中得到对象可能未初始化错误。如果我把同一条线放在开关案例1中,它可以正常工作,但在案例2中我得到了错误。有人能告诉我如何从构造函数创建newActor对象的外部调用对象上的方法吗?我将永远感激它,它让我头疼,而我的讲师在解释事情方面很糟糕。谢谢 public class ActorsMain { public sta

在另一个名为actors的类中,我有一个名为“filmList”的ArrayList,我想在切换中使用案例2来调用newActor.filmList.get(I);但我不断从编译器中得到
对象可能未初始化
错误。如果我把同一条线放在开关案例1中,它可以正常工作,但在案例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; 


    }
    }





}       
公共类ActorsMain{
公共静态void main(字符串[]args){
扫描仪kb=新扫描仪(System.in);
字符串fName=“”;
字符串lName=“”;
字符串地址=”;
智力年龄;
字符串filmEntry=“”;
字符串代码=”;
ArrayList actors=新的ArrayList();
ArrayList films=新的ArrayList();
int-choice=0;
while(选项!=3){
System.out.println(“进行选择。\n1.添加参与者\n2.列出参与者”);
choice=kb.nextInt();
开关(选择){
案例1:
System.out.println(“\n请输入参与者的名字:”);
fName=kb.next();
System.out.println(“请输入演员的第二个名字:”);
lName=kb.next();
System.out.println(“请输入演员地址:”);
地址=kb.next();
System.out.println(“请输入演员年龄:”);
age=kb.nextInt();
kb.nextLine();

对于(int a=0;a我猜您的Actor类有一个名为filmList的ArrayList,您希望在某个位置从中获取值。如果是这种情况,您可能应该创建一个getFilmListIndex(int pos)方法,该方法接收索引值并返回电影列表存储的任何对象

  public String getFilmListIndex(int pos)
      {
         return filmList.get(i);
      }
然后从ActorMain类调用此方法

  String result = newActor.getFilmListIndex(i);

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

您可以在声明它时为它指定一个伪值,但通常情况下,最好只在实际使用范围变量的地方才使用它&它们有一个有效值


这将建议将所有参与者的详细信息放在一个单独的方法中,或者(不那么好)放在{}用花括号括起来,并且只在赋值时声明它们。让可访问变量与未定义、伪值或过时值挂在一起比只声明一个变量的作用域等效于它的值有效和适用时更不正确。

您将不得不在s的作用域之外声明newActor女巫声明。在你的开关的第二个盒子里,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());
}
您将得到一个不同的错误,上面写着“找不到符号”,这更切题。显然,交换机内的案例共享范围,以便它们可以“看到对方”。我假设这与SAN突破有关。交换机都是一个块,这些案例只确定入口点

我不知道你想做什么来告诉你把你的newActor声明放在哪里,但关键是现在你的开关中的案例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");
}
作为一个很长的补充说明,您没有向ArrayList传递类型参数。Java不知道ArrayList包含演员和电影,除非您这样说:

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

在案例2中,您似乎开始尝试这样做,但目前也无法这样做。如果没有
,它将告诉您“找不到符号”或“不兼容类型”,因为ArrayList包含一个没有类型参数的对象数组。(它仍然是一个带有type参数的对象数组,但您可以像使用传入的类型一样使用它。)

请在问题文本中使用格式和英语,不清楚你在问什么……而且我的讲师在解释>方面很糟糕-他不是唯一一个道歉的人,我不确定这里的格式是如何工作的。无需澄清,因为radiodef已经完美地回答了我的问题,但没有感觉到需要成为一个聪明的人,不像其他人谢谢你的回答,但我的问题是当我输入“newActor.getFilmListIndex”(或者我尝试调用的任何方法)时newActor的下划线为红色,表示局部变量可能未初始化。如果在换行符之前移动完全相同的行,则在案例1中效果良好。是的,但仅在案例1中使用age。案例1是添加一个参与者,获取所有详细信息并创建一个名为“newActor”的参与者对象并将其存储在actorMain中的arraylist中,创建一个具有电影标题的电影对象,并将其存储在actor类中的arraylist中。案例2仅打印actorMain中arraylist中存储的演员信息和actor类中arraylist中的电影信息。我可以很好地打印演员,但当我尝试打印电影时通过使用“newActor.filmList.get(i)”在循环中进行优化它说newActor没有初始化。很抱歉出现了文字墙。非常感谢,这非常有帮助。我将尝试使用if-else语句和arraylist的type参数重新构造,看看我的进展如何。再次感谢,我将与课程中的一些人分享这个答案,因为我从这个答案中学到了比f更多的东西六周后从我的讲师那里得到(我不能提高投票率,但如果我能
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];
    }
}
System.out.println(actors.get(aIndex).filmList.get(fIndex));