【问题标题】:Return statement before a catch statement在 catch 语句之前返回语句
【发布时间】:2012-08-03 12:37:45
【问题描述】:

我已经向我的 AsncTask 添加了一个 return 语句,但我仍然收到一个错误,告诉我添加一个。停止此语法错误的唯一代码 sn-p 是在 catch 语句之后添加一个 return 语句,但这会适得其反,并且不能满足程序的需求,而且我无法访问我需要的字符串(我需要检查返回的输出流是否等于真。

代码:

@Override
    protected Boolean doInBackground(String... userandpass)  { //I still get an error telling me to add a return statement
        // TODO Auto-generated method stub
        URL url;
        try {
            url = new URL("http://127.0.0.1:1337");
            HttpURLConnection URLconnection = (HttpURLConnection) url.openConnection();
            URLconnection.setDoOutput(true);
            URLconnection.setChunkedStreamingMode(0);

            //output stream
            OutputStream out = new BufferedOutputStream(URLconnection.getOutputStream());
            writestream(out, userandpass);

            //buffered server response
            InputStream in = new BufferedInputStream(URLconnection.getInputStream());
            String result = readstream(in);
            Log.e(result, result);

            // check we haven't been redirected (Hotel Wifi, for example).
            checkrediect(URLconnection, url);

            Boolean result_true = checkresult(result);

            if(result_true) {
                return true;  
            } else {
                return false;
            }



        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

【问题讨论】:

  • 从第一次看我会说,第二个 catch-block 是缺少返回语句的执行路径。
  • 删除对result_true 的冗余检查,并在方法末尾添加return result_true;,这就是您所需要的
  • if(result_true)return true;else return false;return result_true 相同。

标签: java android return


【解决方案1】:

但这会适得其反,并且不能满足程序的需求

那么“程序的需求”是什么?如果抛出IOException,您希望得到什么结果?它必须是真、假或例外——目前,它们都不是。

我建议大多数的时候,你只是让异常冒泡......你真的可以在IOException的情况下像没有任何问题一样继续吗? p>

顺便说一句,这很丑:

if(result_true) {
    return true;  
} else {
    return false;
}

只需使用:

return checkresult(result);

(最好重命名各种方法和变量以遵循 Java 命名约定。)

我还建议将其更改为返回 boolean 而不是 Booelean

【讨论】:

  • 我知道如果调用 IOException 函数一定是假的,但是我如何检查字符串是否为真?
  • 为什么不在这些 catch 块中为 result_true 分配适当的值,并在方法结束时返回 result_true?
  • @srikanthyaradla 所以,我检查结果,然后在 catch 块之后添加一个 return 语句?
  • 是的,你在方法的开头用一些默认值声明变量结果,并在适当的地方分配值并在方法结束时返回
  • @TheBlueCat:如果 IOException 意味着您应该返回 false,那么您可以从 catch 块中返回它,如果您真的想要...
【解决方案2】:

您的 catch 语句有一个既不返回值也不引发异常的分支。

} catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

那里的那个块需要有某种形式的代码来返回一些东西,否则该方法将无法正常运行。

【讨论】:

    【解决方案3】:
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    }
    

    【讨论】:

      【解决方案4】:

      您必须在method block 中添加return 语句。

      这样做......

      protected Boolean doInBackground(String... userandpass)  { 
      
      boolean isOk = false;
      
      // Your code
      
      if(result_true) {
                      isOk = true;
      
                  } else {
      
                      isOk = false;
                  }
      
       return isOk;
      
       }
      

      【讨论】:

      • 从 if-else 块中返回布尔变量 result_true 不会被视为从方法返回...所以我设置另一个变量 isOk 以在块外返回
      【解决方案5】:

      catch (IOException e) 块中必须有一个 return 语句。当您捕获 IOException 时,编译器不知道要返回什么。

      你有 2 个选择,返回一些东西 (false),或者重新抛出异常。

      【讨论】:

        猜你喜欢
        • 2014-10-02
        • 1970-01-01
        • 2018-10-14
        • 2017-05-15
        • 1970-01-01
        • 2014-03-10
        • 2018-05-23
        • 2013-10-02
        • 2014-08-25
        相关资源
        最近更新 更多