3

「bulletproof」というパッケージを使用してユーザーからの入力を取得するプログラムを作成しようとしています (完了、正常に動作します) が、一致を見つけると無限ループ エラーが発生します。私は少し頭がいっぱいで、コードが機能しない理由を完全に理解していないと感じています。私はこれを学ぼうとしているので、直接の答えを探しているわけではありませんが、どんな助けでも心から感謝します. ありがとう、私のコードは次のとおりです。

--編集-- プログラムが動作するようになりました。ご協力いただきありがとうございます。

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;
}  

}

4

6 に答える 6

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;
}  
于 2012-10-17T06:38:41.453 に答える
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;
}

}

于 2012-10-17T06:42:53.663 に答える
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;
 }
于 2012-10-17T06:36:51.593 に答える
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はあなたがやりたいことをするのに十分です。

于 2012-10-17T06:37:22.950 に答える
0

breakwithinループはループ notforを中断します。そのため、while ループは無限に続きます。forwhile

変更を確認してください。私は行っており、正常に動作するはずです。

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で十分です。

于 2012-10-17T06:37:25.067 に答える
0

これは、ラベルのないブレークは for ステートメントを終了するだけですが、while(true) は反復を続けるためです。

解決策は、次のようにラベル付きのブレークを使用することです。

  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を参照してください。

于 2012-10-17T06:48:22.490 に答える