循环的无限循环和死代码

时间:2016-12-07 16:13:15

标签: java infinite-loop

此方法应该通过电视连续剧对象的arraylist进行查看。但是,我的for循环中的j ++给出了死代码错误,并且输入当前未保存在arraylist中的标题会导致无限循环。不知道为什么。 SOS 编辑;设置此作业的讲师不允许使用迭代器

public void deleteseries(Scanner sc){

    System.out.println("Enter the Title of the Series you want to Remove");
    System.out.println("Cureent Series Stored: ");
    for (TV_Series tv:series) {
        System.out.println(tv.getTitle());
    }
    String title_to_delete = sc.nextLine().toUpperCase();
    boolean found = false;
    do{
        for(int j = 0; j < series.size(); j++){
            if (series.get(j).getTitle().equalsIgnoreCase(title_to_delete))
                {
                    series.remove(j);
                    System.out.println("Series Removed");
                    found=true;
                    //Jump out of loop

                    break;
                }
            else
                {
                    System.out.println("No Results for Title "+title_to_delete);
                    found = false;
                    break;
                }
        }   
    }while(found==false);
}

3 个答案:

答案 0 :(得分:1)

这里有几个相关的问题;我想你可能需要回顾一下循环结构是如何工作的。

您编写了一个应该遍历数组的for循环;没关系。但是,不是让它迭代,而是在第一次迭代期间将其设置为从循环中断开。我假设你将它包含在一个do-while循环中,因为你注意到它没有迭代,但只是反复重复循环的第一次迭代。此外,do-while循环的退出条件将found转为true,这就是为什么如果找不到匹配则循环不会退出的原因。

通常,您不需要在for中附加while来进行迭代; for本身就是一个循环结构。您for不会自行迭代的唯一原因是您输入break语句;只有在想要中止迭代时才需要使用break来退出for循环。因此,break块中if可能有意义,但肯定不是else块。

最后,写入的else块将在每次迭代时运行(一旦其他问题得到修复);说&#34;找不到匹配&#34;是没有意义的。在每次迭代。如果循环遍历所有迭代而没有找到匹配(即如果if仍然存在),则可以在<{em} for循环之后放置found以打印错误假)。

答案 1 :(得分:1)

ifelse部分都是break内部for循环。

此外,如果您想查找和删除,请使用以下内容:

另外,我使用了迭代器,因为循环时将修改列表。

public void deleteseries(Scanner sc){

    System.out.println("Enter the Title of the Series you want to Remove");
    System.out.println("Cureent Series Stored: ");
    for (TV_Series tv:series) {
        System.out.println(tv.getTitle());
    }
    String title_to_delete = sc.nextLine().toUpperCase();
    boolean found = false;
    //do{
        for(Iterator<TV_Series> itr = series.iterator(); itr.hasNext();){
            TV_Series tvs = itr.next();
            if (tvs.getTitle().equalsIgnoreCase(title_to_delete))
                {
                    itr.remove();
                    System.out.println("Series Removed");
                    found=true;
                    //Jump out of loop

                    break;
                }
                //else
                //{
                //    System.out.println("No Results for Title "+title_to_delete);
                //    found = false;
                //    break;
                //}
        }   
//    }while(found==false);
}

答案 2 :(得分:1)

当修改可迭代集合时,我强烈建议使用迭代器来防止&#34; ConcurrentModificationException&#34;。此外,我还删除了一些冗余代码,比如do-while部分,以修复i ++问题和更清晰的代码。检查我的命题:

public void deleteseries(Scanner sc){

    System.out.println("Enter the Title of the Series you want to Remove");
    System.out.println("Cureent Series Stored: ");
    for (TV_Series tv:series) {
        System.out.println(tv.getTitle());
    }
    String title_to_delete = sc.nextLine().toUpperCase();
    Iterator<TV_Series> it = series.iterator();
    while (it.hasNext()){
        TV_Series tmpSeries = it.next();
        if (tmpSeries.getTitle().equalsIgnoreCase(title_to_delete)) {
            it.remove();
            System.out.println("Series Removed");
            break;
        }
    }
}