无法引用使用Java中的合成的方法

问题描述

为什么允许这样做:

import java.util.ArrayList;

public class BurgerClass {

    private DefaultMenuClass defaultMenu;
    ArrayList<String> burgerMenuItems = new ArrayList<String>();
    
    public void displayBurgerMenu() {
        
        burgerMenuItems = defaultMenu.getDefaultBurgerMenu();
        for (String burger : burgerMenuItems) {
            System.out.println(burger + "\n");
        }

    }
}

这不是:

import java.util.ArrayList;

public class BurgerClass {

    private DefaultMenuClass defaultMenu;
    ArrayList<String> burgerMenuItems = new ArrayList<String>();
    burgerMenuItems = defaultMenu.getDefaultBurgerMenu(); //error here
    public void displayBurgerMenu() {
        
        
        for (String burger : burgerMenuItems) {
            System.out.println(burger + "\n");
        }

    }
}

解决方法

要回答具体问题,第一个被“允许”而第二个则不是-

“允许”或“不允许”都不是

在两种情况下,正如Mureinik所说,defaultMenu从未被初始化。在第一种情况下,这没关系,因为从未调用displayBurgerMenu(),所以您永远不会到达{em>将会导致错误的行burgerMenuItems = defaultMenu.getDefaultBurgerMenu();

在第二种情况下,您尝试调用它,在您标记为//error here的行上,这样您会(我假设 * )得到NullPointerException

无论哪种方式,您都需要在尝试调用方法之前将defaultMenu初始化为非空值。

您需要按照以下步骤进行操作
private DefaultMenuClass defaultMenu = new DefaultMenuClass(<some-params?>);

或通过其他方式获取DefaultMenuClass对象。仅凭您在问题中提供的代码,就无法确定应该如何发生。


另外,并且与您的错误没有任何关系,两者都没有意义
ArrayList<String> burgerMenuItems = new ArrayList<String>();
然后
burgerMenuItems = defaultMenu.getDefaultBurgerMenu();

您将burgerMenuItems初始化为空的ArrayList,然后通过将burgerMenuItems设置为.getDefaultBurgerMenu()返回的列表来立即丢弃该列表(如果没有错误并且返回了某些内容)


*您真的应该您在问题中遇到什么错误,而不要让我们承担任何责任。

,
npm start

您可以在上面的代码中看到,我通过提供构建器模式来初始化BurgerClass的所有属性。

还可以使用构造函数初始化dafaultMenu属性。并且在创建 @Data @Builder class BurgerClass { private DefaultMenuClass defaultMenu; public void displayBurgerMenu() { List<String> burgerMenuItems = defaultMenu.getDefaultBurgerMenu(); for (String burger : burgerMenuItems) { System.out.println(burger + "\n"); } } } @Data @Builder class DefaultMenuClass { List<String> defaultBurgerMenu; public DefaultMenuClass(List<String> defaultBurgerMenu) { this.defaultBurgerMenu = defaultBurgerMenu; } } class Main { public static void main(String[] args) { BurgerClass obj = BurgerClass.builder().defaultMenu(DefaultMenuClass.builder().defaultBurgerMenu(Arrays.asList(new String[]{"Item1","Item2"})).build()).build(); obj.displayBurgerMenu(); } } 实例时,传递 BurgerClass 值。

DefaultMenuClass

只需运行上面的代码,您就会知道。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...