2012-07-11 30 views
6

Tôi đã cố gắng để có được quyền này trong 2 ngày và sáng về sẵn sàng để ném một cái gì đó .....Làm thế nào để tôi nhận được một biến trong một khối try/catch?

Tôi có một JSONArray mà tôi đang xử lý trong một khối try/catch nhưng nó không dường như truyền biến vào cuối.

Mã của tôi:

try{ 
    //Get the element that holds the results (JSONArray) 
    JSONArray getresults = json.getJSONArray("results"); 
    //Loop the Array 
    for(int i=0;i < getresults.length();i++){      
     HashMap<String, String> map = new HashMap<String, String>(); 
     JSONObject e = getresults.getJSONObject(i); 
     totalpass = e.getJSONObject(i).getString("ftotalpass");       
    }        

} catch(JSONException e)  { 
    Log.e("log_tag", "Error parsing data "+e.toString());          
} 

Tôi đã thử tất cả các dinh thự của khai báo biến trước, trong, sau khi thử/khối catch nhưng tôi chỉ không thể làm cho nó vượt qua phần còn lại của mã của tôi.

Tôi đang làm gì sai?

+0

Bạn đang giao dịch với json, bất cứ nơi nào bạn khai báo bạn phải khai báo trong khối try try – AkashG

+0

bạn có thể đăng dữ liệu json của mình không? – Suresh

+2

Đọc về phạm vi trong Java! – hsz

Trả lời

8

Hmm ...

Bạn có thể khai báo nó bên ngoài. Chẳng hạn như

JSONArray results = null; 

try { 
    results = json.getJSONArray("results"); 
}... 

Bằng cách này bạn có thể truy cập bên ngoài, nhưng hãy chắc chắn sử dụng nếu xem nó có rỗng không.

Nếu bạn không đặt JSONArray results = null trình biên dịch có thể sẽ rên rỉ về biến không được khởi tạo.

Tiếp tục giải thích:

Điều này xảy ra vì sự phạm vi. Khi bạn khai báo bên trong thử, phạm vi của biến kết thúc khi thử kết thúc. Khi bạn khai báo bên trong một if, khi đó nếu kết thúc, biến không thể được truy cập nữa. Điều này là rất hữu ích cho các biến tạm thời, nơi bạn chỉ sử dụng chúng để so sánh hoặc tốt hơn khả năng đọc mã, tái sử dụng bộ nhớ, vv (idk nếu điều này thậm chí là một từ). Dù sao, nếu biến của bạn cần phải được truy cập ở khắp mọi nơi bên trong một lớp, nó có thể tốt hơn để khai báo là một trường.

Tôi không đọc this explanation, nhưng có vẻ tốt. Hãy xem.

+0

Xin cảm ơn! đó chỉ là những gì tôi đang tìm kiếm. – user1517838

1

Tuyên bố nó ở bên ngoài sẽ giải quyết vấn đề:

JSONArray getresults = null; 
try{ 
    //Get the element that holds the results (JSONArray) 
    getresults = json.getJSONArray("results"); 
    //Loop the Array 
    for(int i=0;i < getresults.length();i++){      
     HashMap<String, String> map = new HashMap<String, String>(); 
     JSONObject e = getresults.getJSONObject(i); 
     totalpass = e.getJSONObject(i).getString("ftotalpass");         
    }        
} catch(JSONException e)  { 
    Log.e("log_tag", "Error parsing data "+e.toString());          
} 
+0

Bạn đang thiếu dấu chấm phẩy. –

+0

hey ... cảm ơn các bạn! –

0

Khai báo biến của bạn bên ngoài khối và gán nó vào bên trong khối:

JSONArray getresults; 

try { 

    ... 
    getresults = ...; // your assignment; 
    ... 
}        
catch(JSONException e) { 
    Log.e("log_tag", "Error parsing data" + e.toString()); 
    getresults = ...; //maybe some other assignment 
} 

//use variable 
if(getresults ...) { 
    ... 
} 
1

cách Gabriel mô tả công việc, nhưng bạn có thể chạy vào một nullPointerException với approach.I'd rằng thay vì làm điều này:

JSONArray results = new JSONArray(); 

try { 
    results = json.getJSONArray("results"); 
}... 
+1

Điều này là đúng, nhưng tôi nói rằng anh ta nên kiểm tra xem biến có null không. Tôi nghĩ rằng điều này là tốt hơn bởi vì nếu anh ta không nhận được bất kỳ kết quả, bất cứ điều gì anh ta muốn làm với biến bên ngoài không nên được thực hiện, sau khi tất cả các ông đã không có kết quả. –

+1

đúng :-) –

Các vấn đề liên quan