【问题标题】:Java - Non-static method cannot be referenced from a static contextJava - 不能从静态上下文中引用非静态方法
【发布时间】:2015-06-07 06:17:21
【问题描述】:

我想要做的应该很简单: 我正在尝试使用 Android Studio 读取 XML 文件并将数据写入数据库。

我的代码的简化版本如下:

MainActivity.java:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        try {
            XMLReader r = new XMLReader();
            r.Reader(getXML());
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //Creates each station
    public void newStation(int stationID, String stationName)
    {
        DBHandler dbHandler = new DBHandler(this, null, null, 1);

        Station station = new Station(stationID, stationName);

        dbHandler.addStation(station);
    }

    private String getXML()
    {
        //code to get xml
        return xml;
    }
}

XMLReader.java:

public class XMLReader {
    public void Reader (String xmlFile) throws XmlPullParserException, IOException
    {
        String[] stationData = new String[]{"",""};
        //code to cut xml file up and put it into stationData
        MainActivity.newStation(Integer.parseInt(stationData[0]), stationData[1]);
    }
}

(如果你愿意,我也可以为 station.java 和 DBHandler.java 添加代码)

现在我遇到的问题是:“无法从静态上下文引用非静态方法 'newStation(int, java.lang.String)'”

并且该建议告诉我将 newStation 设为静态,但是如果我这样做了,则会出现以下问题:“'...MainActivity.this' 无法从静态上下文中引用”

建议告诉我让 newStation 不是静态的...

据我所知,newStation 需要是静态的才能将变量传递给它,但是我不能在静态类中使用上下文“this”。我尝试创建一个上下文,但感觉就像是想把自己从一个洞里挖出来。

我怎样才能解决这个编程悖论?我通常可以在这里找到任何问题的答案,但这是我第一次找不到。如果您知道我错过的解决方案的链接,请在下面发布。非常感谢。

【问题讨论】:

标签: java android database static


【解决方案1】:

您已经有一个MainActivity 类型的对象。这个是调用读取XML的方法。

顺便说一句,请坚持Java Code Conventions 并以小写字母开头的方法名称。另外,方法总是做某事,所以它们应该是动词

public class XMLReader {
    public void read (String xmlFile) ...
}

最简单的解决方法是返回解析后的数据并从MainActivity内部调用newStation方法:

public class XMLReader {
    public String[] read (String xmlFile) throws XmlPullParserException, IOException {
        String[] stationData = new String[]{"",""};
        //code to cut xml file up and put it into stationData
        return stationData;
    }
}

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            XMLReader r = new XMLReader();
            String[] stationData = r.read(getXML());
            newStation(Integer.parseInt(stationData[0]), stationData[1]);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void newStation(int stationID, String stationName) { ... }
    private String getXML() { ... }
}

【讨论】:

  • 谢谢 Seelenvirtuose,如果我有声望,我会投赞成票。我按照你的建议修正了我的方法名称。
【解决方案2】:

你正在使用

MainActivity.newStation(...)

只有在 newStation(...) 方法被定义为 static 时才能这样做,例如:

public static void newStation()

您可以通过非静态方式访问它:

activity.newStation(...)

其中activity 是对MainActivity 对象的引用。您可以将MainActivity 的引用作为参数传递给XMLReader 构造函数,例如:

public class XMLReader {
     MainActivity activity;
     public XMLReader(MainAcrivity activity){
         this.activity = activity;
     }

     ...
}

MainActivity.java:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    try {
        XMLReader r = new XMLReader(this);
        r.Reader(getXML());
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

【讨论】:

  • 不可能将方法设为静态。 newStation 方法使用当前的 MainActivity 实例 (this) 作为另一个调用的参数。另一个建议可行,但他从哪里获得实例?
  • @Seelenvirtuose 我从来没有建议他应该使用static 方法我只是在解释错误,他可以将活动的引用作为参数传递给构造函数,这是他的决定。跨度>
  • 好的,如果这不是您的意图,那么您的回答并不清楚。您应该修改它以使其更清晰。至于第二部分:OP 显然是编程新手。让他一个选择,他看不到,明确要求不适合一个好的答案。请更新,我将删除我的反对票。
猜你喜欢
  • 2013-04-05
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多