CodeHS中AP计算机科学Pinata类构造器null输出问题求助
解决Pinata类实例输出null值的问题
问题原因
当你创建sweetie实例时,调用的是仅初始化candy字段的构造器:new Pinata("sour straws")。此时color和shape字段未被赋值,Java中引用类型字段的默认值为null,所以toString()方法拼接字符串时会输出null。同理,接收colorType和shapePin的构造器也会导致candy字段为null(若使用该构造器创建实例)。
解决方案
有两种常用方法可以解决这个问题,核心是确保所有字段都被赋予有效值:
方法1:构造器间复用(调用无参构造)
让其他构造器先调用无参构造初始化所有字段,再覆盖需要自定义的部分,避免重复代码:
public class Pinata { private String candy; private String color; private String shape; public Pinata() { candy = "hard candy"; color = "rainbow"; shape = "donkey"; } public Pinata(String candyType, String colorType, String shapePin) { this(); // 先调用无参构造初始化所有字段 candy = candyType; color = colorType; shape = shapePin; } public Pinata(String colorType, String shapePin) { this(); // 复用无参构造的默认candy值 color = colorType; shape = shapePin; } public Pinata(String candyType) { this(); // 复用无参构造的默认color和shape值 candy = candyType; } public String toString() { return color + " " + shape + " pinata filled with " + candy; } }
方法2:给字段设置默认初始值
在声明字段时直接赋予默认值,这样无论调用哪个构造器,未被修改的字段都会使用默认值:
public class Pinata { private String candy = "hard candy"; private String color = "rainbow"; private String shape = "donkey"; public Pinata() { // 字段已初始化,无参构造可留空 } public Pinata(String candyType, String colorType, String shapePin) { candy = candyType; color = colorType; shape = shapePin; } public Pinata(String colorType, String shapePin) { color = colorType; shape = shapePin; } public Pinata(String candyType) { candy = candyType; } public String toString() { return color + " " + shape + " pinata filled with " + candy; } }
修改后测试结果
运行PinataTester类,输出将变为:
rainbow donkey pinata filled with hard candy blue star pinata filled with chocolate rainbow donkey pinata filled with sour straws
内容的提问来源于stack exchange,提问作者Hannah
相关产品推荐
相关产品推荐

