2017-05-06 111 views
0

我是新來的,我鑽進了我的編碼麻煩,我希望有人能夠幫助我打破這個循環,導致無論什麼I型,它總是在loop.My代碼如下:爲什麼我不能退出這個while循環(java)?

boolean flag = true; 
    while(flag) 
    { 
     System.out.println("Please enter the movie's title:"); 
     title = s.nextLine().trim(); 
     if(title.trim().equals("")) 
     { 
      System.out.println("Please do not enter an empty title!"); 
     } 
     else 
     { 
      for(Movie m: movies) 
      { 
       if(title.equals(m.getTitle().trim())) 
       { 
        System.out.println("Title already exists!"); 
       } 
       else 
       { 
        m.setTitle(title); 
        flag = false; 
        break; 
       } 
      } 
     } 
    } 
+2

這是嘗試調試器或單元測試的完美機會。調試器讓您逐步完成您的代碼一條語句。通過單元測試,可以通過針對預期的輸入和輸出運行它們來驗證您的功能要麼幫助你解決你的問題。 (雖然單元測試用較小的函數可以更好地工作) – byxor

+2

大概沒有電影的名字與輸入的標題不相等,或者你一直輸入所有的空格。 –

+1

請注意,您不需要在第一個if中再次修剪。它並沒有太大的傷害,只是沒有必要。 –

回答

0

您可以使用Java標記中斷的一個鮮爲人知的功能。

例如,從officials docs

class BreakWithLabelDemo { 
    public static void main(String[] args) { 

     int[][] arrayOfInts = { 
      { 32, 87, 3, 589 }, 
      { 12, 1076, 2000, 8 }, 
      { 622, 127, 77, 955 } 
     }; 
     int searchfor = 12; 

     int i; 
     int j = 0; 
     boolean foundIt = false; 

    search: 
     for (i = 0; i < arrayOfInts.length; i++) { 
      for (j = 0; j < arrayOfInts[i].length; 
       j++) { 
       if (arrayOfInts[i][j] == searchfor) { 
        foundIt = true; 
        break search; 
       } 
      } 
     } 

     if (foundIt) { 
      System.out.println("Found " + searchfor + " at " + i + ", " + j); 
     } else { 
      System.out.println(searchfor + " not in the array"); 
     } 
    } 
} 

所以你基本上把一個標籤,比如,outer:實際的循環之前,然後你可以使用break outer;打出來的外循環,而不是內部循環的。請注意,這也適用於continue

+0

謝謝,我會稍後再試 – Adam

0

休息時間爲循環,但您仍然需要再次休息才能退出while循環。

+5

在打破之前,'flag'設置爲'false'。 –

+0

我不太明白,因爲我已將「標誌」設置爲「false」...它應該在循環時退出 – Adam

+1

我懷疑它從未達到該代碼。 'title.equals(m.getTitle()。trim())'可能總是返回'true'。 – byxor

0
if(title.trim().equals("")) 
    { 
     System.out.println("Please do not enter an empty title!"); 
     flag=flase; 
    } 

在這裏也

if(title.equals(m.getTitle().trim())) 
      {System.out.println("Title already exists!"); 
flag=false; 
break; 

} 
0

有一個小的邏輯問題。 當你開始輸入電影名稱時,你會停止輸入/輸入值在某個點,對吧? 該方案還必須知道,所以加一個條件檢查title.trim()。等於(「破發」)

boolean flag = true; 
     while(flag) 
     { 
      System.out.println("Please enter the movie's title:"); 
      title = s.nextLine().trim(); 
      if(title.trim().equals("")) 
      { 
       System.out.println("Please do not enter an empty title!"); 
      } 
      else if(!title.trim().equals("break")) 
      { 
       for(Movie m: movies) 
       { 
        if(title.equals(m.getTitle().trim())) 
        { 
         System.out.println("Title already exists!"); 
        } 
        else 
        { 
         m.setTitle(title); 
         flag = false; 
         break; 
        } 
       } 
      }else{ 
       flag = false; 
       break; 
      } 
    } 

上面的代碼應該做的伎倆。 讓我知道如果問題仍然存在@亞當。

+0

謝謝,我剛剛嘗試過這種方法,但它仍然無效... – Adam

0

最初當您輸入第一個標題時,「for」循環可以通過的「movies」序列中沒有對象,因此我相信您的代碼最初不會進入「for」循環並繼續。

我建議在for循環之前使用if(movies == null)語句來檢查空序列。

+0

感謝您的建議,我的電影一開始是空的,我需要添加一些對象起初,我添加了flag = null語句到if(movies == null),但它仍然不起作用 – Adam

+0

爲什麼要給布爾變量null。只要檢查天氣電影序列是空的。如果是這樣,只需將標題添加到序列中,並設置flag = false和break。 – Agni