'while'语句无法在不抛出异常的情况下完成 - Android

时间:2015-01-23 16:02:02

标签: java android while-loop infinite-loop

通过这种方法,我每秒都在更新TextView

 private void UpdatingTime(final String endTime, final long diffInDays) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(ONE_SECOND);
                            mHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    // Updating time every second
                                    long diffInHours = Methodes.diffInHours(endTime, diffInDays);
                                    long diffInMinutes = Methodes.diffInMinutes(endTime, diffInDays, diffInHours);
                                    long diffInSeconds = Methodes.diffInSeconds(endTime, diffInDays, diffInHours, diffInMinutes);

                                    tvTime2.setText(addZeroInFront(diffInHours)
                                            + ":" + addZeroInFront(diffInMinutes)
                                            + ":" + addZeroInFront(diffInSeconds));
                                }

                                private String addZeroInFront(long diffInHours) {
                                    String s = "" + diffInHours;
                                    if (s.length() == 1) {
                                        String temp = s;
                                        s = "0" + temp;
                                    }
                                    return s;
                                }
                            });
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
    }

这种方法很完美。但我得到了这个警告:

  

'while'语句无法在不抛出异常的情况下完成。

     

报告for,while或do语句只能   通过抛出异常退出。虽然这些陈述可能是正确的,   它们通常是编码错误的症状。

我讨厌警告,我想解决它。我该如何解决这个警告,或者这个无限循环有更好的解决方案......?

4 个答案:

答案 0 :(得分:17)

这个警告是误报;你应该忽略它。

通常,无限循环是某处错误的标志;在你的代码中,无限循环正是你想要的。

答案 1 :(得分:17)

您可能正在使用Android Studio或IntelliJ。

如果是这样,你可以在包含无限循环的方法上面添加这个来抑制警告:

@SuppressWarnings("InfiniteLoopStatement")

或者添加这个"魔法"评论声明:

//noinspection InfiniteLoopStatement

这将告诉IDE这没关系。

更一般地说,当您收到误报警告时,请执行Alt+Enter并执行以下屏幕截图中显示的内容(仅当您的课程充满误报时选择课程,以获得相同的警告)

suppress warning image

More info here on Jetbrains help

答案 2 :(得分:2)

如果你想要每秒触发一些东西,你可以遵循这种方法,你可以确定它会在你离开后删除回调。在您完成活动之前,它会每秒调用一次。如果需要,您甚至可以在生命周期中删除之前的回调,例如onPause()或onStop()。

Handler handler = new Handler();

@Override
protected void onCreate(Bundle savedInstanceState) 
{
   super.onCreate(savedInstanceState);
   handler.post(updateTime);
}

@Override
protected void onDestroy() 
{
   super.onDestroy();
   handler.removeCallbacks(updateTime);
}


private final Runnable updateTime = new Runnable()
{
    public void run()
    {
        try 
        {
            // Updating time every second
            long diffInHours = Methodes.diffInHours(endTime, diffInDays);
            long diffInMinutes = Methodes.diffInMinutes(endTime, diffInDays, diffInHours);
            long diffInSeconds = Methodes.diffInSeconds(endTime, diffInDays, diffInHours, diffInMinutes);
            tvTime2.setText(addZeroInFront(diffInHours)
                                        + ":" + addZeroInFront(diffInMinutes)
                                        + ":" + addZeroInFront(diffInSeconds));

            handler.postDelayed(this, 1000);    
        }
        catch (Exception e) 
        {
            e.printStackTrace();
        }   
    }

    private String addZeroInFront(long diffInHours) 
    {
        String s = "" + diffInHours;
        if (s.length() == 1) 
        {
            String temp = s;
            s = "0" + temp;
        }
        return s;
    }
};

答案 3 :(得分:2)

您可能使用IntelliJ IDEA收到此警告,对吗?

正如其他人已经提到的那样,通常可以忽略此警告。

如果您要将其停用,请打开“设置”,然后转到编辑器>检查并搜索Infinite loop statement。只需取消选中该框,即可完成。

通常,您只需将文字光标放在要禁用的警告上,然后按 Alt + Enter ,然后点击检查信息字段,然后点击禁用检查