如何从main,java访问变量

时间:2012-03-22 22:14:49

标签: java jvm

我在尝试让HashMap可以访问其所在类中的其他方法时遇到了麻烦。

这基本上就是我想做的事情,

class object
    method main
        this.test=9
    method fire
        output this.test

这是真正的代码

import java.util.*;
import java.lang.String;
import java.util.HashMap;

public class problem {
    public HashMap dict;

    public problem() {
        HashMap<String, String[]> dict = new HashMap<String, String[]>();

        // put everything into hashmap
        String[] items = { "toys", "sun" };
        dict.put("animal", items);
        String[] items_2 = { "fun", "games" };
        view.put("human", items_2);

        this.view = view;

        // start
        this.BeginM();
    }

    public void BeginM() {
        System.out.println(this.view.get("human")[0]); // should give "fun"
    }
}

我在输出阶段遇到此错误:

array required, but java.lang.Object found

3 个答案:

答案 0 :(得分:5)

你知道吗?我曾经有过这样的日子,无论你怎么努力,没有什么东西可以完全正常工作,为了让某些东西正常工作,我将修复你的代码!< / p>

我有时会看到人们在这里发布了一些奇怪问题的重写,我总是想知道为什么!?现在我知道,这是为了弥补你的虚拟机有一天瘫痪的一天无缘无故地,你有一个无法复制的错误,直到你离开的那一刻,你的狗自发地忘记了他的家训。

无论如何,您需要确定是否要将该变量称为dictview。选择一个,但你需要坚持下去。我真的不在乎,但我在这里使用dict。如果您更喜欢另一个,嘿,这是您的代码,做您喜欢的!但是不要同时使用它们,这会让人感到困惑。

您的问题是,在您的领域,您只是使用HashMap。使用花哨的好东西,或演员。否则,HashMap只保留Object个。而Object不是String[]。因此,您需要将get()的结果转换为String[],否则您可能会忘记所有这些并使用花哨的好类型的东西(有时我们称之为“泛型”)。我将使用花哨的好东西(HashMap<String, String[]>),但就像我说的那样 - 这是你的代码,如果你想要施放!

无论如何,这让我们:

public class problem
{
    HashMap<String, String[]> dict;

    public problem()
    {
        HashMap<String, String[]> dict = new HashMap<String, String[]>();

        // put everything into hashmap
        String[] items =
        {
            "toys", "sun"
        };
        dict.put("animal", items);
        String[] items_2 =
        {
            "fun", "games"
        };
        dict.put("human", items_2);

        this.dict = dict;

        // start
        this.BeginM();
    }

    public void BeginM()
    {
        System.out.println(this.dict.get("human")[0]); // should give "fun"
    }
}

看我的第3行?通过将该字段dict声明为HashMap<String, String[]>,现在BeginM()知道它所拥有的对象类型,您将不会再出现该错误。

虽然我会更进一步,使它更简洁,更容易出错:

public class Problem
{
    private final HashMap<String, String[]> dict;

    public void Problem()
    {
        dict = new HashMap<String, String[]>();

        dict.put("animal", new String[] { "toys, "sun" });
        dict.put("human", new String[] { "fun", "games" });

        BeginM();
    }

    public void BeginM()
    {
        System.out.println(dict.get("human")[0]);
    }
}

那我在那里做了什么?好吧,首先我把Problem大写了。让类名以大写字母开头是一种惯例。当然不是强制性的,但它很高兴,尤其是当你与其他开发人员合作时。例证:我认为problem的构造函数是一个缺少返回值的方法!另外,我将dict设为final和private,这样您以后就不会意外覆盖该字段。我把它设为私有,这是一个很好的设计。如果其他人需要了解它,我们可以给他们一个访问方法。最后,我摆脱了this.,因为我真的不喜欢它 - 但是,嘿,仍然是你的代码,如果你想要的话就把它放回去!

答案 1 :(得分:0)

我相信this.view.get("human")会返回一个String,而不是一个数组。您需要使用this.view.get("human").charAt(0)而不是this.view.get("human")[0],因为Java字符串不能像数组一样编入索引。

答案 2 :(得分:0)

更改:(BTW,您的示例中缺少)

Map view = new HashMap<String,String[])

Map<String,String[]> view = new HashMap<String,String[])