【问题标题】:exception in Buffered Reader缓冲阅读器中的异常
【发布时间】:2013-08-22 16:29:15
【问题描述】:

我正在尝试使用 bufferedreader 以非常简单的代码从控制台读取数据

System.out.println("Enter a port number : ");

    BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
    String s = bufferRead.readLine();
        int port = Integer.parseInt(s);

当消息被打印时,它没有给我任何时间在控制台中写入,它直接显示 Java.lang.NumberFormat 异常,因为我没有输入任何内容。 有什么可能出错的建议吗?

【问题讨论】:

  • 你尝试调试代码了吗?
  • 不,因为这个小代码很简单,我用了很多次,但我不知道发生了什么,所以它没有给我时间纠正任何事情。我使用了扫描仪,它给出了相同的结果
  • @rima101 您在输入任何值之前是否按了enter 键?
  • ^^这似乎不是不调试它的好理由
  • BufferedReader 无需请求即可读取,他这样做是为了缓冲数据。因此,也许他读取了一些行尾、文件尾等字符 - 这不是数字,会导致异常。

标签: java exception bufferedreader string


【解决方案1】:

使用Console.readLine 从控制台读取输入。您可以使用System.console 获取Console 的实例。

例子:

String s = System.console().readLine("Enter a port number: ");
int port = Integer.parseInt(s);

如果System.console() 返回null,这意味着(从JVM 的角度来看)您实际上没有控制台。如果您的标准输入已被重定向,则可能会发生这种情况。

【讨论】:

    【解决方案2】:

    它工作得非常好。但我添加了一些检查和一些 try-catch 块。

      public static void main(String[] args)
      {
        System.out.println("Enter a port number: ");
    
        BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
        String s = null;
        Integer i = null;
        try
        {
          s = bufferRead.readLine();
          System.out.println("INPUT: " + s);
    
        }
        catch (IOException e)
        {
          System.out.println(e);
        }
    
        if (s == null)
          return;
    
        try
        {
          i = Integer.parseInt(s);
        }
        catch (NumberFormatException e)
        {
          System.out.println(e);
          return;
        }
        System.out.println("PORT: " + i);
      }
    

    【讨论】:

      【解决方案3】:

      你是如何运行这段代码的? 我在eclipse上试过了,对我来说效果很好

      public static void main(String args[]) throws IOException {
          System.out.println("Enter a port number : ");
      
          BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
          String s = bufferRead.readLine();
              int port = Integer.parseInt(s);
          System.out.println("entered port :: " + port);    
      }
      

      这是输出

      Enter a port number : 
      56
      entered port :: 56
      

      【讨论】:

      • 运行后直接回车,不输入任何内容。
      • public static void main(String args[]) throws IOException { System.out.println("输入端口号:"); BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));字符串 s = bufferRead.readLine();尝试 { int port = Integer.parseInt(s); System.out.println("输入端口::" + 端口); } catch (NumberFormatException nfe) { System.out.println("在这里处理你的异常情况"); } }
      • 使用 try..catch 来验证输入是个坏主意。你可以检查 - if(s != null && !s.isEmpty())
      【解决方案4】:

      如果您在 Eclipse 中运行它,请检查您的运行配置。在公共选项卡上,有标准输入和输出部分。检查是否选中了“分配控制台(输入所需)”。

      【讨论】:

        【解决方案5】:

        我不明白您为什么会遇到这个问题。我从 Eclipse IDE 和 Windows 命令提示符中执行了您的代码,两者似乎都运行良好。 因此,作为独立代码,它可以正常工作,但如果您间歇性地遇到问题,则可能是由于输入流中已经存在一些未读字符,因此不允许您输入 read() 方法所需的更多数据. 作为清理工作,我建议致电

        System.in.skip(System.in.available());
        

        在致电read()之前。

        【讨论】:

        • 这里也一样。没有问题。
        • 运行后直接回车,不输入任何内容。
        【解决方案6】:
        String input = bufferRead.readLine();
        
        if(input != null && !input.isEmpty()) {
            int port = Integer.parseInt(input);
        } else {
            // Handle end of stream
        }
        

        Reference 用于 readLine 方法。

        您可以使用Scanner。你可以做-

        Scanner sc = new Scanner(System.in);
        int i = sc.nextInt();
        

        更新:

        根据你们的cmets,这是整个班级-

        import java.io.*;
        
        public class SOTest1{
        
            public static void main(String args[]) throws IOException {
        
                System.out.println("Enter a port number : ");
        
                BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));
        
                String input = bufferRead.readLine();
        
                if(isNumber(input)){
                    int port = Integer.parseInt(input);
                    System.out.println("entered port :: " + port);    
                } else {
                    System.out.println("entered port is not a number :: " + input);
                }            
        
            }
        
            public static boolean isNumber(final String str) {
        
               if(str == null || str.isEmpty()){
                   return false;
               }
        
                int size = str.length();
        
                for (int i = 0; i < size; i++) {
                    if (!Character.isDigit(str.charAt(i))) {
                        return false;
                    }
                }
        
                return true;
            }
        
        }
        

        【讨论】:

        • 句柄流结束是什么意思
        • @rima101 如果您检查了我提供的参考链接,您会在 readLine 方法下看到 - 此方法返回“包含行内容的字符串,不包括任何行终止字符,或 null如果已到达流的末尾。”
        • @rima101 如果你运行程序并回车,你也需要检查字符串是否为空。
        • 我都试过了,没有任何改变。它根本没有给我时间写任何东西
        • @rima101 检查更新。复制类 SOTest1 并将其放在名为 SOTest1.java 的文件中。然后编译运行。
        猜你喜欢
        • 2020-10-24
        • 2023-03-28
        • 2018-05-18
        • 2017-09-23
        • 1970-01-01
        • 2023-03-23
        • 2015-02-06
        • 2012-08-13
        • 2011-10-23
        相关资源
        最近更新 更多