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

编辑: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()做什么?看起来您每次循环时都会调用它两次,并且可能会丢弃第一个调用(但检查它)并存储第二个调用而不是检查它。我认为你应该为每个循环只调用一次

请注意,您的代码还有其他问题:

  • 不需要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

您是否有发送文本的终端连接?如果是这种情况,终端协议会逐个字符地发送,这意味着您永远不会让scanner().equals("exit") 为真,因为它只需要一个字符而不是整个字符串。

于 2013-11-14T22:04:04.150 回答