2012-02-27 71 views
0

我面臨一個很奇怪的錯誤,我無法解釋傳承,也許你可以幫我:奇怪的錯誤日誌在Java(Android版)

我與JSON工作,我有包裝類在像一個JSON的響應代碼{ 「代碼」: 「0」}

public class Container { 

    int responseCode=0; 
    protected int _object_id=0; 

    public Container(String fromJSON){ 
     _object_id=new Random().nextInt(); 
     try { 
      setWithJSON(fromJSON); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      responseCode=-1; 
     } 
    } 

    protected JSONObject setWithJSON(String input) throws Exception{ 
     JSONObject json = new JSONObject(input); 
     responseCode = json.getInt("code"); 
     return json; 
    } 

} 

延伸的I類有另一個類用於包裹響應代碼+的網址:{ 「代碼」:「0 「,」url_tag「:」http://good.url.com「}

public class URLContainer extends Container { 
    private final String TAG="Test"; 
    private String _url = "default_url"; 

    public URLContainer(String fromJSON) { 
     super(fromJSON); 
    } 

    @Override 
    protected JSONObject setWithJSON(String input) throws Exception { 
     JSONObject json= super.setWithJSON(input); 
     _url=json.optString("url_tag", "no_url"); 
     getUrl(); //Just for print the pointB 
     Log.e(TAG,"Point A ("+_object_id+"): url="+_url); 
     return json; 
    } 

    public String getUrl() { 
     Log.e(TAG,"Point B ("+_object_id+"): url="+_url); 
     return _url; 
    } 

    public void setUrl(String url) { 
     _url = url; 
    }  
} 

以及活動類:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    String json="{\"code\":\"0\",\"url_tag\":\"http://good.url.com\"}"; 
    URLContainer container = new URLContainer(json); 
    Log.e("adsads",""+container.getUrl()); 
} 

和生成的日誌是:

E/Test(20264): Point B (-569874754): url=http://good.url.com 
E/Test(20264): Point A (-569874754): url=http://good.url.com 
E/Test(20264): Point B (-569874754): url=default_url 
E/Final(20264): default_url 

爲什麼最終的調用返回的DEFAULT_URL而不是一個好?

+0

有什麼奇怪的?預期的行爲是什麼? – aioobe 2012-02-27 12:09:50

+0

預期的行爲應始終爲url =「http://good.url.com」。不是嗎? – Addev 2012-02-27 12:12:51

+0

這是我的問題重複: http://stackoverflow.com/questions/9391231/member-not-initialized-in-child-class – pengguang001 2012-02-27 12:56:08

回答

2

這是因爲在URLContainer的構造你super(fromJSON);的。什麼happends是

  • 調用URLContainer的構造
  • 調用容器的構造
  • 調用URLContainer的setWithJSON(String input) // _ URL在返回的JSON對象
  • 調用設置你的期望值集裝箱的構造函數// _url未設置在新創建的JSON對象中

只在URLContainer的實例創建該實例後調用setWithJSON(String input)

1

這將工作

 ....... 
     public Container(String fromJSON){ 
      _object_id=new Random().nextInt(); 
      //   try { 
      //    setWithJSON(fromJSON); 
      //   } catch (Exception e) { 
      //    e.printStackTrace(); 
      //    responseCode=-1; 
      //   } 
     } 
     ....... 

在活動:

 public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      String json="{\"code\":\"0\",\"url_tag\":\"http://good.url.com\"}"; 
      URLContainer container = new URLContainer(json); 
      container.setWithJSON(json); 
      Log.e("adsads",""+container.getUrl()); 
     } 
+0

是的,但我想知道爲什麼它不起作用。謝謝你的回答。 – Addev 2012-02-27 12:26:07

+0

我的英語差異很大。檢查URLContainer的創建 - 首先在Container的構造函數中創建Container,名爲setWithJson(overrided),設置_url ...,構造函數Conteiner完成後 - 開始UrlContainer的初始化字段 - 並且您有_url =「default_url」 – 2012-02-27 12:35:32