【问题标题】:Using readline() and split()使用 readline() 和 split()
【发布时间】:2012-11-05 23:41:13
【问题描述】:

下面的代码大部分是不言自明的。但是,我在两种情况下遇到了麻烦:

  1. 即使命令行留空,while 循环也不会退出。

  2. 如果输入是test t1,则key 变量应该是“测试”(使用System.out.println(key))这样做,但是由于某种原因它仍然没有进入if 条件。

    String[] broken_text = null; String text = "";
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    while((text = reader.readLine()) != null) {     
      broken_text =    text.split(" ");
      String first_key = broken_text[0];    
      if (first_key == "test") {
            //some statements    
       }
    }
    

我不确定为什么会发生这种情况,我们将不胜感激任何有关此问题的帮助。

【问题讨论】:

    标签: java split bufferedreader readline


    【解决方案1】:

    使用 equals() 来检查字符串是否相等。

    if (first_key == "test") {
             //some statements
        }
    
    should be
    
    if (first_key.equals("test")) {
             //some statements
        }
    

    您的 text 永远不会是 null,因为您将其声明为

    String text = "";
    

    因此你的while循环将是一个无限循环

    改变

    String text = ""; 
    to
    String text = null;
    

    或者如果您想将 text="" 字符串保留为空字符串。

    使用

    while(!(text = reader.readLine()).isEmpty()) 
    

    【讨论】:

    【解决方案2】:

    循环没有结束,因为空行导致readLine() 返回一个空字符串,而不是null

    比较失败,因为字符串必须与equals()而不是==进行比较

    【讨论】:

      【解决方案3】:

      在这种情况下,String text 永远不会是 null。您可以使用:

      while (!(text = reader.readLine()).isEmpty()) {
      

      【讨论】:

        【解决方案4】:

        这应该是您编辑的代码:

        String[] broken_text = null;
        String text = "";
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
        while((text = reader.readLine()) != null && !text.isEmpty()) {
            broken_text = text.split(" ");
            String first_key = broken_text[0];
            if ( "test".equals(first_key)) {
                 //some statements
            }
        }
        

        之所以将(text = reader.readLine()) != null改成(text = reader.readLine()) != null && !text.isEmpty()是因为readLine()遇到文件结束符作为第一个字符时返回null,遇到第一个字符时返回“”(空字符串)是\r(回车)、\n(换行)或\r\n(回车后跟换行)。在检查isEmpty() 之前,您必须始终检查null

        unix / Linux 控制台文件结尾是 [ctrl][d] 而在 DOS 上是 [ctrl][z]

        注意:如果您想从文件(您更有可能获得文件结尾)而不是控制台读取输入,那么您的 reader 将被初始化如下:

            BufferedReader reader = new BufferedReader(new FileReader("d:\\a1.txt"));
        

        (假设您的输入数据在文件中:"d:\a1.txt"。)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-02
          • 1970-01-01
          • 1970-01-01
          • 2015-08-31
          • 1970-01-01
          • 2015-10-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多