程序输出问题

时间:2014-03-15 18:11:11

标签: java

我为冗长的提交道歉,但我在使这个程序正常工作方面遇到了一些困难。

还有另一个运行此程序的驱动程序,它要求我打印出魔术师的名称,等级,耗材等(给定某些参数)。

但是,当我使用toString()方法打印出String时。我不断得到一个 我的名字/等级/用品的“null”回复。我的号码似乎也没有更新。

有人可以看看我做错了吗?

我似乎无法让程序拿起魔术师的参数。

public class Magician
{
    private String name, level, supplies;  
    private int galleons;   
    private double health;

    public Magician(String initialValues)
    {   
        double health = 1000;
        int galleons = 200;
        initialValues = name + "#" + level + "#" + supplies;
    }

    public String toString()
    {
        return "Name: " + name+
        "Level: " + level +
        "Galleons: " + galleons +
        "Health: " + health +
        "Supplies: " +supplies; 
    }
}  

这是我无法打印出来的Driver程序的开头:

public class MagicAndMalice
{
    public static void main (String[] args) 
    {
        Magician harry = new Magician("Harry Potter#apprentice#Owl#Wand");
        System.out.println(harry);  // test toString() method
        System.out.println("------------------------\n\n");
    }
}

4 个答案:

答案 0 :(得分:2)

首先,您再次声明healthgalleons。您不应该再次声明它们,只需指定值:

health = 1000;
galleons = 200;

此外,您似乎对作业感到困惑。如果您想为namelevelsupplies分配一些值,则必须执行以下操作:

name = ...;
level = ...;
supplies = ...;

如果initialValues包含"a#b#c"之类的字符串,并且您想要分配每个"部分"对于这些变量,您可以使用String#split()

String[] parts = initialValues.split("#");

name = parts[0];
level = parts[1];
supplies = parts[2];

但是我真的建议你阅读一本书或者学习一些Java教程,这样你就可以先掌握基础知识了。

答案 1 :(得分:0)

当您将对象创建为

Magician harry = new Magician("Harry Potter#apprentice#Owl#Wand");

仅加倍health = 1000;& int galleons = 200;作为一些值初始化。

当您拨打toString()方法时

public String toString()
         {
         return "Name: " + name+
         "Level: " + level +
         "Galleons: " + galleons +
         "Health: " + health +
         "Supplies: " +supplies; 
          }

返回某个字段的值null,因为它根本没有初始化。

答案 2 :(得分:0)

我认为将构造函数更改为使用单独的参数而不是一个必须拆分的字符串可能更有意义。

public Magician(String name, String levels, String supplies, int gallons, double health) {
    this.name = name;
    this.levels = levels;
    ...
}

注意前缀" this。"这可以防止类的成员变量和传递给构造函数的参数之间的名称冲突。

答案 3 :(得分:0)

您很难理解Java中的赋值事项。您不会需要#之类的分隔符,但如果您这样做,则需要例如public class Magician { private String name, level, supplies; private int galleons; private double health; public Magician(String name, String level, String supplies) { health = 1000; galleons = 200; this.name = name; this.level = level; this.supplies = supplies; } // Let's do some Constructor overloading here public Magician(String initialValueString) { String[] initialValues = initialValueString.split("#"); this(initialValues[0], initialValues[1], initialValues[2]); } public String toString() { return "Name: " + name + "Level: " + level + "Galleons: " + galleons + "Health: " + health + "Supplies: " + supplies; } } public class MagicAndMalice { public static void main (String[] args) { // Method one Magician harry = new Magician("Harry Potter", "apprentice", "Wand"); System.out.println(harry); System.out.println("------------------------\n\n"); // Method two Magician ron = new Magician("Ron Weasley#apprentice#Owl"); System.out.println(ron); System.out.println("------------------------\n\n"); } } 。 substr构造函数中给定的String。

这是一个简短的(未经测试的)版本,应该澄清我的意思:

supplies

如果你想在{{1}}字段中拥有的值多于一个值,请查看数组或尝试使用一些正则表达式拆分/子数值。

希望有助于更清楚地了解Java中的变量赋值。