2014-07-17 41 views
0

在此之后question on SO我遇到了问题。这是我试图解析JSON:Gson - 非静态变量不能从静态上下文中引用

{ 
    "origin": "XX.XX.XXX.XXX" 
} 

这里是我的三个主要类别的重要组成部分:

DDNS.java

public static void main(String[] args) throws Exception { 
    Net.returnIp(); 
    System.out.println(Data.origin); 
} 

Net.java

static void returnIp() throws UnsupportedEncodingException, MalformedURLException, IOException { 
    //Ommited code, all it does is do a GET request to get response 
    String responseString = new Scanner(response,"UTF-8").useDelimiter("\\A").next(); 

    Data data = new Gson().fromJson(responseString, Data.class); 
} 

Data.java

public class Data { 
    public String origin; 

    @Override 
    public String toString() { 
     return String.format("ip:%s", origin); 
    } 
} 

除非我忽略了答案中的某些内容,否则我不完全确定自己做错了什么,尽管我有一个粗略的想法。有人能解释为什么会发生这种情况吗?谢谢。

+1

'origin'不是'static'。 – awksp

+0

既不Data ... – aldux

+0

@ user3580294是的,我可以得到这么多,但我对Java非常新,并没有完全理解静态对象。我不能只声明它是静态的,那么我该如何解决它?感谢您的意见。 – Novicode

回答

2

问题是,您正试图访问主方法中的非静态成员Data,而实际上没有引用Data对象。

我能想到的解决这个问题的最简单的方法是改变Net#returnIp()返回它解析JSON时创建Data

//Net.java 
static Data returnIp() throws UnsupportedEncodingException, MalformedURLException, IOException { 
    //Ommited code, all it does is do a GET request to get response 
    String responseString = new Scanner(response,"UTF-8").useDelimiter("\\A").next(); 

    return new Gson().fromJson(responseString, Data.class); 
} 

然后你可以使用你所创建的Data对象:

//DDNS.java 
public static void main(String[] args) throws Exception { 
    Data data = Net.returnIp(); 
    System.out.println(data); // this will automatically call data's toString() and format its origin 
} 

对象类的概念是Java语言的基础。你需要了解他们才能走得很远。

我会推荐阅读oracle的Object-Oriented Programming Concepts,从“什么是对象?”开始。和“什么是课堂?”链接。

相关问题