【问题标题】:Confused execution in try with return value in java在 java 中使用返回值的 try 混淆执行
【发布时间】:2018-01-05 21:17:27
【问题描述】:

我已经在 Android 中运行并调试了这个 java 代码,我注意到 return true 没有任何效果,因为它充当 break,然后 return false 最终被执行。我使用了 Android Studio 及其 Step Over 功能进行调试。

protected Boolean doInBackground(Void... params) {
   // Cancel discovery because it will slow down the connection
   mAdapter.cancelDiscovery();
   // Start connection attempt
   for(int i=0;i<10;i++) {
      try {
         // Connect the device through the socket. This will block
         // until it succeeds or throws an exception
         mmSocket.connect();
         // connection successful [it should return true]
         return true;
      }
      catch (IOException connectException) {
         // Unable to connect; close the socket and get out
         try { mmSocket.close(); }
         catch (IOException closeException) {  }
      }
   }
   // connection failed 10 times [but it always returns false]
   return false;
}

更新:

就像 EJP 和其他人所说的那样,return true 不作为休息。 doInBackground 函数按预期运行。问题是,由于外部代码块,AsyncTask 在return true 执行后总是被取消。对此我很抱歉。

此帖可以关闭。谢谢。

【问题讨论】:

  • 如果你在 For 中写了一个 return,它总是作为一个休息。另外,即使在您的连接中发生了一些异常,您也只是在捕获它而不是在那之后返回。为什么要将连接语句放在 for 循环中。即使您想确保它在您连接之前一直尝试,请在 do while 循环中执行此操作,如果连接成功建立,请在 while 中检查。
  • 这不是很好的编程,因为我在循环中使用了 return 语句,这会导致垃圾收集失败。
  • @FadySaad 不,它不会导致垃圾收集出现故障。无法想象你的想法是从哪里来的。

标签: java android return try-catch


【解决方案1】:

我已经在 Android 中运行并调试了这个 java 代码,我注意到 return true 没有任何效果

仅当出现异常时。十个例外。

因为它起到了休息的作用

没有。

然后最终执行return false。

不,它没有。可以到达最终的return 的唯一方法是如果有十个例外。

所以个例外。十个例外。第一个是ConnectException,之后的都是与您尝试重新连接同一个套接字而不是先创建新套接字的无效尝试有关。

跟踪异常并亲自查看。

【讨论】:

    【解决方案2】:

    你确定没有例外吗?从您的代码中,如果 .connect 方法没有问题,它将返回 true,尝试记录您的异常以检查连接是否成功。

    【讨论】:

    • 这是评论,不是答案。
    • 使用这段代码你无法知道是否抛出了异常。
    • 这就是答案,你需要在检查代码流之前确保连接成功。
    【解决方案3】:

    如果发生异常,return true 将不会生效。为什么false 返回,因为异常被静默捕获。

    我可以在这里给你一个示例代码,

    private static void connect() throws Exception
    {
        throw new Exception();
    }
    
    private static Boolean doInBack() {
        for (int i = 0; i < 10; i++) {
            try {
                if (i % 7 != 0 || i == 0)
                    continue;
                connect();
                return true;
            } catch (Exception e) {
                System.out.println("Exception");
    
            }
        }
    
        return false;
    }
    public static void main(String[] args)
    {
        System.out.print(doInBack());
    
    }
    

    关于try-catch-finally-return 执行顺序的参考。

    【讨论】:

    • 每个人只有在给出合理解释的情况下才能投反对票。
    【解决方案4】:

    与 EJP 所说的类似,您在 try-catch 中的代码失败了 10 倍,并不是因为 return true 的行为与您预期的不一样。当它失败 10 倍时,你应该得到return false

    需要记录您的connectExceptioncloseException,至少使用e.printStackTrace 之类的内容。

    另外,不要让多个return 短视你。试试这样:

    protected Boolean doInBackground(Void... params) {
       ...
       boolean success = false;
       for (int i = 0; i < 10; i++) {
          try {
             ...
             mmSocket.connect();
             success = true;
          } catch (IOException connectException) {
             ...
          }
       }
       return success;
    }
    

    如果connect() 成功,则success = true,否则success 将保持false。 (现在毫无疑问,您对为什么返回就像休息一样感到困惑)

    作为旁注,是的,这里没有更多上下文,您可能需要考虑如果第一个 connect() 失败,那么所有后续连接也可能会失败。

    【讨论】:

      猜你喜欢
      • 2017-05-22
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 2022-01-26
      • 2021-11-27
      • 2011-12-20
      • 1970-01-01
      相关资源
      最近更新 更多