2015-08-11 26 views
5

Tôi đăng một số dữ liệu vào một webservice đây là đoạn:Tại sao điều này không phải là một tuyên bố

try { 
    response = UniversalHttpUrlConnection.postJSONObject(ctx.getResources().getString(R.string.delete_one), UniversalHashMapToJSONObjectParams.createObjectForParams(deleteMap)); 
    System.out.println("Response from del task" + response); 

    if(response != null) 
     JSONObject jObj = new JSONObject(response); 

    System.out.println("Deletion" + DatabaseHandler.getInstance(ctx).removeReceipt(receipt)); 

} catch (JSONException report) { 
    report.printStackTrace(); 
} 

IDE của tôi là phàn nàn về:

if(response != null) 
    JSONObject jObj = new JSONObject(response); 

Những tuyên bố chính xác con người: Không một tuyên bố - Tại sao điều này xảy ra, tôi có thiếu cái gì ở đây không?

nếu tôi sử dụng:

if (response != null) { 
    JSONObject jObj = new JSONObject(response); 
} 

Các IDE không phàn nàn.


Để biết chi tiết ở đây là phương pháp hoàn chỉnh của tôi:

public static void deleteReceipt(Receipt receipt, Context ctx) { 

    SessionManager sessionManager; 
    sessionManager = new SessionManager(ctx); 
    HashMap<String, String> map = sessionManager.getUserDetails(); 
    String email = map.get("email"); 

    if (CheckConnection.isNetworkConnected(ctx)) { 

     System.out.println("local id " + receipt._id); 
     Receipt rec = DatabaseHandler.getInstance(ctx).getReceipt(receipt._id); 

     String webReceiptId = rec.web_receipt_id; 
     System.out.println("WebReceipt ID = " + webReceiptId); 
     if (webReceiptId.equalsIgnoreCase("dummy")) { 
      // Delete from local 
      System.out.println("Deletion" + DatabaseHandler.getInstance(ctx).removeReceipt(receipt)); 
     } else { 
      // delete from server 
      // delete from local 
      HashMap<String, String> deleteMap = new HashMap<>(); 
      deleteMap.put("email", email); 
      deleteMap.put("type", "Android"); 
      deleteMap.put("key", Utility.getencryptkey()); 
      deleteMap.put("task_id", webReceiptId); 
      deleteMap.put("receipt_id", String.valueOf(receipt._id)); 

      String response = null; 
      try { 
       response = UniversalHttpUrlConnection.postJSONObject(ctx.getResources().getString(R.string.delete_one), 
         UniversalHashMapToJSONObjectParams.createObjectForParams(deleteMap)); 
       System.out.println("Response from del task" + response); 

       if (response != null) { 
        JSONObject jObj = new JSONObject(response); 
       } 

       System.out.println("Deletion" + DatabaseHandler.getInstance(ctx).removeReceipt(receipt)); 

      } catch (JSONException report) { 
       report.printStackTrace(); 
      } 
     } 
    } 
} 

Trả lời

12

Một khai báo biến như JSONObject jObj = ... phải bên trong một khối.

Do đó một trong hai:

 if(response != null) { 
      JSONObject jObj = new JSONObject(response); 
     } 

hoặc

 JSONObject jObj = ... 
     if(response != null) 
      jObj = new JSONObject(response); 

là hợp lệ.

+0

Oh my! Tôi không biết rằng, bất kỳ lý do cụ thể nào được thực thi? – User3

+1

@ User3 Vâng, khi bạn khai báo một biến, nó phải có một phạm vi. Khi bạn khai báo nó theo cách bạn đã thử, bên trong một câu lệnh if không có dấu ngoặc, nó sẽ có cùng phạm vi với câu lệnh if. Bây giờ, nếu bạn truy cập biến đó sau câu lệnh if thì sao? Theo lý thuyết, biến đó chỉ được khai báo nếu câu lệnh if là đúng. Vì vậy, trình biên dịch không biết nếu biến được khai báo hay không. Vì vậy nó không được phép. – Eran

+0

Bây giờ, rõ ràng hơn là nhờ @Eran – User3

12

Những gì bạn có là một khai báo biến cục bộ - và điều đó không được cho phép như là một tuyên bố ... bởi vì nó vô nghĩa. Tại sao khai báo một biến mà bạn sẽ không thể sử dụng, bởi vì nó ngay lập tức nằm ngoài phạm vi? Trình biên dịch đang cố ngăn bạn làm sai, về cơ bản.

Trong thuật ngữ JLS, có một Statement và một Block - một khối chứa các lệnh khối, là các câu lệnh, khai báo lớp hoặc khai báo biến cục bộ ... và khai báo biến cục bộ không phải là câu lệnh.

+0

Được rồi, cần phải đọc về điều đó. Cảm ơn :) – User3

0

Trong thuật ngữ JLS, có một lệnh và khối - khối chứa khối lệnh, là các câu lệnh, khai báo lớp hoặc khai báo biến cục bộ ... và khai báo biến cục bộ không phải là câu lệnh.

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