问题描述
为什么允许这样做:
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
只需运行上面的代码,您就会知道。