2012-10-17 48 views
3

我想創建一個程序,將從用戶使用稱爲'bulletproof'的包輸入(完成,工作正常),但我得到一個無限循環錯誤當我找到一場比賽時。我有點頭大,我不覺得我完全理解爲什麼我的代碼不工作。我不想直接回答,因爲我正在努力學習,但任何幫助都會受到真誠的讚賞。謝謝,我的代碼如下。使用方法來搜索列表中的匹配在Java中

--edit-- 我得到了程序的工作。謝謝大家的幫助,你們這些人是巨大的。

import bulletproof.*; 

public class A26_1 { 
public static void main(String[] args) { 
    BPScanner kb = new BPScanner(); 
    String reservedWordToCheck = kb.getStringFromUser("Enter a word to see if it's reserved or enter leave: "); 

    System.out.println(ReservedWordChecker(reservedWordToCheck)); 
} 

public static String ReservedWordChecker(String reservedWordToCheck) { 
    String[] table = { 
      "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", 
      "continue", "default", "do", "double", "enum", "extends", "final", "finally", "float", 
      "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", 
      "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", 
      "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while" 
     }; 

    while (true) {      
     if (reservedWordToCheck.equalsIgnoreCase("leave")) 
      break;     
     boolean found = false; 

     for (int i=0; i < table.length; i++) { 
      if (reservedWordToCheck.equalsIgnoreCase(table[i])) { 
       found = true; 
       break; 
      }    
      if (found) 
       System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier."); 
      else 
       System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild.");      
     }  
     System.out.println("OK BYE"); 
    } return reservedWordToCheck; 
} 

}

+0

一般輸入?就好像我在這個清單上寫了一個字,它應該匹配並且說「是」,然後單詞「是一個保留字」。程序會根據方法中提供的列表進行檢查。我希望澄清事情。 – user1752197

+0

嗨,一個好的做法是使用字符串相等函數,如下所示:if(「leave」.equalsIgnoreCase(reservedWordToCheck))。這樣做可以防止發生NullPointerException。如果reservedWordToCheck爲null,則我們期望條件爲false,但可避免RuntimeException。 – sgroh

+0

你也應該考慮修改你的代碼只有一個循環,你不需要外部的while循環。如果之前爲和最後你可以簡化你的代碼,如果(表[i] .equalsIgnoreCase(reservedWordToCheck)){返回reservedWordToCheck;}。另外請記住,在您的方法之外將String [] Table聲明爲常量不是每次使用ReservedWordChecker時都需要創建一個新實例。我也認爲這個方法叫做existsReservedWord,可以返回一個布爾值,而不是你正在搜索的單詞。 – sgroh

回答

0

需要,因爲你for休息,當你得到一個匹配寫你for外循環下面的代碼,但你while循環繼續運行

if (found){ 
      System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier."); 
      break; 
} 
else{ 
      System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild."); 
      break; 
} 
0

您還沒有打破在找到匹配後出現while循環: -

您應該移動您的if-else你的for-loop,並添加破你的if,這將打破你的比賽while是否被找到: -

for (int i=0; i < table.length; i++) { 
    if (reservedWordToCheck.equalsIgnoreCase(table[i])) { 
     found = true; 
     break; 
    } 
} 
if (found) { 
    System.out.println("Yeah, " + reservedWordToCheck + 
         ", is reserved as a Java identifier."); 
    break; 
} else { 
    System.out.println("Nope, the word " + reservedWordToCheck + 
         ", isn't reserved); 
    break; 
} 

但我不明白,你爲什麼在這裏需要一個while循環。它的那種毫無意義。你的for-loop就足以做你想做的事情。

0

breakfor環路中斷for環路不是while。所以,while循環會無限地繼續。

看到的變化,我已經做了,它應該工作正常。

while (true) 
{ 
    ....... 
    ....... 

for (int i=0; i < table.length; i++) 
{     
    if (reservedWordToCheck.equalsIgnoreCase(table[i])) 
    {      
     found = true; 
     break; // remove break from here   
    } 

    if (found)      
    { 
     System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier."); 
     break; 
    }         
} // end for 
if(found) 
{ 
    System.out.println("OK BYE"); 
} 
else      
{ 
    System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild."); 
} 
break; 
} // end while 

但是,你不需要while(true)構造來檢查這一點。只有for就足夠了。

3

我覺得做的最簡單的方法就是 -

public static boolean ReservedWordChecker(String reservedWordToCheck) { 
    String[] table = { 
      "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", 
      "continue", "default", "do", "double", "enum", "extends", "final", "finally", "float", 
      "for", "goto", "if", "implements", "import", "instanceof", "int", "interface", "long", "native", 
      "new", "package", "private", "protected", "public", "return", "short", "static", "strictfp", "super", 
      "switch", "synchronized", "this", "throw", "throws", "transient", "try", "void", "volatile", "while" 
     }; 

     for (String data : table) { 
      if (reservedWordToCheck.equalsIgnoreCase(data)) { 
       return true; 
      } 
     } 
     return false; 
} 
+0

哇,我聽說我可以將它轉換爲布爾值,但我不認爲這會很簡單。這幫了我很多!謝謝! – user1752197

+1

個人而言,我是一個入口和一個退出點的忠實信徒,但那只是我 – MadProgrammer

0

你是不是在正確的位置突破:

for (int i=0; i < table.length; i++) { 
    if (reservedWordToCheck.equalsIgnoreCase(table[i])) { 
     found = true; 
     break; <-- 
    }    
    if (found) 
     System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier."); 
    else 
     System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild.");      
} 

當這個詞被發現,你打出來的for循環和你除了OK BYE之外不顯示任何內容。

更多我不明白爲什麼你把一個無限循環?

喜歡的東西,將工作:

public static String ReservedWordChecker(String reservedWordToCheck) { 
    String[] table = { ... }; 

    if (reservedWordToCheck.equalsIgnoreCase("leave")) { 
     break; 
    } 

    boolean found = false; 
    for (String entry : table) { 
     if (entry.equalsIgnoreCase(reservedWordToCheck)) { 
      found = true; 
      break; 
     } 
    } 

    if (found) { 
     System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier."); 
    } else { 
     System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild.");      
    } 
    System.out.println("OK BYE"); 
    return reservedWordToCheck; 
} 

}

0

那是因爲你的無標籤休息僅完成了聲明,但同時(真)將繼續迭代。

該溶液可使用標記的斷裂,如下:

search: 
    while (true) {      
     if (reservedWordToCheck.equalsIgnoreCase("leave"))   
      break;     
     boolean found = false; 

     for (int i=0; i < table.length; i++) { 
      if (reservedWordToCheck.equalsIgnoreCase(table[i])) { 
       found = true; 
       break search; 
      }    
      if (found) 
       System.out.println("Yeah, " + reservedWordToCheck + ", is reserved as a Java identifier."); 
      else 
       System.out.println("Nope, the word " + reservedWordToCheck + ", isn't reserved. Go hog wild.");      
     }  
     System.out.println("OK BYE"); 
    } return reservedWordToCheck; 

更多信息讀:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

相關問題