【问题标题】:Using the input string "exit" to exit the program in Terminal在终端中使用输入字符串“exit”退出程序
【发布时间】:2013-11-14 21:54:46
【问题描述】:

我正在编写一个小的 .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;
    }

【问题讨论】:

  • 请出示您的scanner()方法。
  • 什么是扫描仪? SSCCE 会有所帮助。

标签: java terminal filewriter


【解决方案1】:

调用scanner() 有什么作用?看起来您每次循环时都会调用它两次,并且可能会丢弃第一个调用(但检查它)并存储第二个调用而不是检查它。我认为你应该为每个循环只调用一次一次

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

  • 不需要scanner() 方法。
  • 没有必要不断地重新创建 Scanner 对象,事实上,如果这样做而不释放资源,您将面临资源耗尽的风险。
  • 改为创建一次 Scanner 对象,然后在 try 块中使用它,并根据需要在其上调用 nextLine()
  • 还可以考虑在while 循环之后关闭文件*,实际上是在try 块的finally 块中。在那里关闭你的扫描仪对象
  • 最好使用equalsIgnoreCase(...) 检查您的字符串。
  • 这样检查更安全:

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

避免NPE

【讨论】:

  • 感谢气垫船。我犯的非常业余的错误。我宣布了两次 - 难怪。
  • 我在 while 循环之外声明了 String input = scanner();,并在 for-loop 结束之前声明了 input = scanner();。谢谢!
  • @theGreenCabbage:见编辑。您的代码中还有其他新手问题。
  • 我把我的更改放在上面。怎么样?
  • finally{System.exit(0);} 是这个意思吗?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-13
    • 2019-03-30
    • 2020-02-14
    • 2013-05-09
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多