2

ユーザーに文字列を要求してファイルに書き込む小さな.jarアプリケーションを作成してい.txtます。入力文字列が ではない場合、プログラムが次の命令 (つまり、日付文字列を書き込み、入力文字列をテキスト ファイルに書き込む) を実行し続けることに興味がありますexit。私のコードはそのためには機能しません。入力した最初の行も最初に入力した行もログに記録しないように依頼してくださいexit。ループを試して、いくつかのことを試しましたdo-whileが、うまくいきませんでした。何が問題なのかしら?

try{
            String input = scanner();
            while(!input.equals("exit")){
                String fileLocation = "/Users/loop/Dropbox/goodTrance.txt";
                FileWriter writer = new FileWriter(fileLocation,true);

                writer.append(returnDate()+": ");
                writer.append(input + "\n");

                writer.flush();
                writer.close();
                input = scanner();
            }
        }catch(Exception e){
            e.printStackTrace();
        }

EDIT:scanner()スキャナー文字列を返す静的メソッドです。returnDate()今日の日付を返します。

public static String returnDate(){
        DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
        Date date = new Date();
        return dateFormat.format(date).toString();
    }

public static String scanner(){
        Scanner input = new Scanner(System.in);
        String writeSomething = input.nextLine();
        return writeSomething;
    }
4

2 に答える 2

2

コールは何をするのscanner()ですか?ループするたびに2回呼び出しているようで、最初の呼び出しを破棄し(ただしチェックしています)、2番目の呼び出しを保存してチェックしていない可能性があります。ループごとに1回だけ呼び出す必要があると思います。

コードには他の問題があることに注意してください。

  • scanner()メソッドは必要ありません。
  • Scanner オブジェクトを再作成し続ける必要はありません。実際、再作成してリソースを解放しないと、リソースが不足するリスクがあります。
  • 代わりに、一度 Scannerオブジェクトを作成し、それを try ブロック内で使用しnextLine()て、必要に応じて呼び出します。
  • また、* while ループの後、実際には try ブロックの finally ブロックでファイルを閉じることを検討してください。そこでもScannerオブジェクトを閉じます。
  • 多くの場合、文字列を でチェックすることをお勧めしますequalsIgnoreCase(...)
  • 次のようにチェックする方が安全です。

String line = null;
while ("exit".equalsIgnoreCase(line)) {
  line = scanner.nextLine();
  // etc...

NPEを避けるために

于 2013-11-14T21:56:16.180 に答える
0

テキストを送信している端末接続がありますか? その場合、ターミナル プロトコルは 1 文字ずつ送信します。つまり、scanner().equals("exit") は文字列全体ではなく 1 文字しか使用しないため、true になることはありません。

于 2013-11-14T22:04:04.150 に答える