0

私はクラスのために小さなプロジェクトを行ってきました。問題なく完全に実行されますが、クラスの自動テスターと比較すると、2行が見つからないというエラーが返されます。コースのスタッフに、行が存在しないときに行をスキャンしようとしているためだと彼らに尋ねましたが、すべてのスキャンを印刷しようとしましたが、そのようなものは見つかりませんでした。これが私のコードにあるすべてのスキャンです。

Scanner sc = new Scanner(System.in);
    String sentence;
    int choice;

    System.out.println("Please enter a sentence:");
    sentence = sc.nextLine();

    printMenu(); // calls a function to print the menu.

    // gets the require action
    System.out.println("Choose option to execute:");
    choice = sc.nextInt();
    sc.nextLine();

(最後のsc.nextLineを使用した場合と使用しない場合で試しました)

static void replaceStr(String str)
{
    String oldWord, newWord;
    Scanner in = new Scanner(System.in);

    // get the strings
    System.out.println("String to replace: ");
    oldWord = in.nextLine();
    System.out.println("New String: ");
    newWord = in.nextLine();

    // replace
    str = str.replace(oldWord, newWord);
    System.out.println("The result is: " + str);
    in.close();
}
static void removeNextChars(String str)
{
    Scanner in = new Scanner(System.in);
    String remStr; // to store the string to replace
    String tmpStr = ""; //the string we are going to change.
    int i; // to store the location of indexStr

    // gets the index
    System.out.println("Enter a string: ");
    remStr = in.nextLine();
    i=str.indexOf(remStr);

    in.close(); // bye bye

    if (i < 0)
    {
        System.out.println("The result is: "+str);
        return;
    }

    // Build the new string without the unwanted chars.
    /* code that builds new string */

    str = tmpStr;
    System.out.println("The result is: "+str);
}

ここでどのように線が漏れる可能性があるか考えていますか?

4

1 に答える 1

4

ここに問題があります。複数の場所で使用in.close();しています(メソッドの最後のステートメントとreplaceStrメソッドの中央付近removeNextChars)。メソッドを使用してscnanerをclose()閉じると、あなたも閉じますInputStream (System.in)。そのInputStreamは、プログラム内で再開することはできません。

public void close() throws IOException --> Closes this input stream and releases any system resources associated with this stream. The general contract of close is that it closes the input stream. A closed stream cannot perform input operations and **cannot be reopened.**

スキャナーを閉じた後に読み取りを試行すると、例外NoSuchElementExceptionが発生します。

プログラムが完了したら、スキャナーを1回だけ閉じてください。

編集:スキャナーの終了/使用法:

YouTubeの主な機能:

   Scanner sc = new Scanner(System.in);
   ....
   .....
   replaceStr(Scanner sc, String str);
   .....
   ....
   removeNextChars(Scanner sc ,String str);
   ....
   ....
   //In the end
   sc.close();


static void replaceStr(Scanner in, String str){
  //All the code without scanner instantiation and closing
  ...
}

static void removeNextChars(Scanner in, String str){
  //All the code without scanner instantiation and closing
  ...
}

あなたはすべて元気でなければなりません。

于 2012-11-04T07:02:13.053 に答える