Java 为什么这不是一个声明

Java 为什么这不是一个声明,java,android-studio,Java,Android Studio,我正在向Web服务发布一些数据,以下是代码片段: try { response = UniversalHttpUrlConnection.postJSONObject(ctx.getResources().getString(R.string.delete_one), UniversalHashMapToJSONObjectParams.createObjectForParams(deleteMap)); System.out.println("Response from del

我正在向Web服务发布一些数据,以下是代码片段:

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正在抱怨:

if(response != null) 
    JSONObject jObj = new JSONObject(response);
确切的说法是: 不是一句话-为什么会发生这种情况,我错过了什么吗

如果我使用:

if (response != null) {
    JSONObject jObj = new JSONObject(response);
}
IDE没有抱怨


有关详细信息,请参见我的完整方法:

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();
            }
        }
    }
}
公共静态无效删除收据(收据收据,上下文ctx){
会话管理器会话管理器;
sessionManager=新的sessionManager(ctx);
HashMap=sessionManager.getUserDetails();
字符串email=map.get(“email”);
如果(选中Connection.isNetworkConnected(ctx)){
系统输出打印项次(“本地id”+收据。\u id);
Receipt rec=DatabaseHandler.getInstance(ctx).getReceipt(Receipt.\u id);
字符串webReceiptId=rec.web\u receipt\u id;
System.out.println(“WebReceipt ID=“+webReceiptId”);
if(webReceiptId.equalsIgnoreCase(“虚拟”)){
//从本地删除
System.out.println(“删除”+DatabaseHandler.getInstance(ctx.removeCeipt(receipt));
}否则{
//从服务器删除
//从本地删除
HashMap deleteMap=新的HashMap();
deleteMap.put(“email”,email);
deleteMap.put(“type”,“Android”);
deleteMap.put(“key”,Utility.getencryptkey());
deleteMap.put(“任务id”,webReceiptId);
deleteMap.put(“receipt_id”,String.valueOf(receipt.u id));
字符串响应=null;
试一试{
response=UniversalHttpUrlConnection.postJSONObject(ctx.getResources().getString(R.string.delete_one),
UniversalHashMapToJSONObjectParams.createObjectForParams(deleteMap));
System.out.println(“来自del任务的响应”+响应);
if(响应!=null){
JSONObject jObj=新的JSONObject(响应);
}
System.out.println(“删除”+DatabaseHandler.getInstance(ctx.removeCeipt(receipt));
}捕获(JSONException报告){
report.printStackTrace();
}
}
}
}

变量声明,如
JSONObject jObj=…
必须位于块内

因此:

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


是有效的。

您得到的是一个局部变量声明-而这本身不允许作为一个语句。。。因为这毫无意义。为什么要声明一个不能使用的变量,因为它马上就超出了范围?基本上,编译器正试图阻止您犯错误


在JLS术语中,有a和-a块包含BlockStatements,它们是语句、类声明或局部变量声明。。。局部变量声明不是语句。

在JLS术语中,有一个语句和一个块-一个块包含块语句,它们是语句、类声明或局部变量声明。。。局部变量声明不是语句。

天哪!我不知道,有什么特别的原因强制这样做吗?@User3好吧,当你声明一个变量时,它必须有一个作用域。当您以您尝试的方式声明它时,在不带括号的if语句中,它将获得与if语句相同的范围。现在,如果在if语句之后访问该变量呢?理论上,只有当if语句为true时才声明该变量。因此编译器不知道是否声明了变量。因此这是不允许的。
        JSONObject jObj = ...
        if(response != null)
            jObj = new JSONObject(response);