Aonzo 2022-01-18 11:05 采纳率: 100%
浏览 89
已结题

怎样解决do while 循环输入Scanner 无法停止的问题(会提示input is never closed,但不会报错,程序也能正常运行)

问题详述:

在程序中采用 do while 循环体进行循环输入 Scanner input = nnew Scanner(System.in); 程序会提示“input is never closed” ,但是不会报错,程序也能正确运行,当我在循环体里面的最后一句加上“input.closed();”时,程序不会报错,可以运行,但会出现问题。如果我把“input.closed();”放在else语句里,就不会提示,也能正确运行了。详情见代码:

问题相关代码:

package Task_01;

import java.util.Scanner;

/**

  • 2、找出数组的最值 定义一个长度为 10 的整型数组 nums ,循环输入 10 个整数。输出数组的最大值、最小值。

  • @author micha

  • /
    public class demo_02 {

    public static void main(String[] args) {

      int count = 0;// 用于循环输入数组元素计数
      int[] num = new int[10];// 定义数组,长度为10
      System.out.println("请输入数组的十个元素:");// 提示输入
      // 循环输入体:
      do {
          Scanner input = new Scanner(System.in);
          if (input.hasNextInt()) {
              num[count] = input.nextInt();
              count++;
          } else {
              System.out.println("输入错误!请重新输入:");
              input.close();
              // 若输入非整型数据则重新输入,计数值不变
          }
      } while (count < 10);
      System.out.println("数组为:");
      for (int i = 0; i < 10; i++) {
          System.out.print(num[i] + ",");
      } // 先循环输出数组元素
      System.out.println("\n-------------------------");
      int dataMax = num[0];
      int dataMin = num[0];
      for (int i = 1; i < 10; i++) {
          if (dataMax < num[i]) {
              dataMax = num[i];
          }
          if (dataMin > num[i]) {
              dataMin = num[i];
          }
      }
      System.out.println("数组中最小元素为:" + dataMin);
      System.out.println("数组中最大元素为:" + dataMax);
    

    }

}

运行结果及报错内容

请输入数组的十个元素:
1
2
3
4
5
6
7
8
9
0
数组为:
1,2,3,4,5,6,7,8,9,0,


数组中最小元素为:0
数组中最大元素为:9

运行结果正确,无报错。

错误代码:
    do {
        Scanner input = new Scanner(System.in);
        if (input.hasNextInt()) {
            num[count] = input.nextInt();
            count++;
        } else {
            System.out.println("输入错误!请重新输入:");
            // 若输入非整型数据则重新输入,计数值不变
        }
        input.close();   
    } while (count < 10);
错误结果:

在输入第一个整数之后会无限输出第七行代码

我想要达到的结果

我的问题是:
1.为什么input.close(); 放在循环体最后面会导致程序无法正确运行?放在else里就可以?
2.如果采用do while循环体,应该怎样正确进行循环输入?
3.我的代码是否合理?是否有更高效的循环输入格式?

谢谢!

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2022-01-18 11:19
    关注

    输入流不要放在循环体内啊,在循环体上面创建输入流,程序最后再关闭流。

    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) {
            int count = 0;// 用于循环输入数组元素计数
            int[] num = new int[10];// 定义数组,长度为10
            System.out.println("请输入数组的十个元素:");// 提示输入
            // 循环输入体:
            Scanner input = new Scanner(System.in);
            do {
                if (input.hasNextInt()) {
                    num[count] = input.nextInt();
                    count++;
                } else {
                    System.out.println("输入错误!请重新输入:");
                    // 若输入非整型数据则重新输入,计数值不变
                }
            } while (count < 10);
    
            System.out.println("数组为:");
            for (int i = 0; i < 10; i++) {
                System.out.print(num[i] + ",");
            } // 先循环输出数组元素
            System.out.println("\n-------------------------");
            int dataMax = num[0];
            int dataMin = num[0];
            for (int i = 1; i < 10; i++) {
                if (dataMax < num[i]) {
                    dataMax = num[i];
                }
                if (dataMin > num[i]) {
                    dataMin = num[i];
                }
            }
            System.out.println("数组中最小元素为:" + dataMin);
            System.out.println("数组中最大元素为:" + dataMax);
            input.close();
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 1月26日
  • 已采纳回答 1月18日
  • 创建了问题 1月18日

悬赏问题

  • ¥15 VB.NET操作免驱摄像头
  • ¥15 笔记本上移动热点开关状态查询
  • ¥85 类鸟群Boids——仿真鸟群避障的相关问题
  • ¥15 CFEDEM自带算例错误,如何解决?
  • ¥15 有没有会使用flac3d软件的家人
  • ¥20 360摄像头无法解绑使用,请教解绑当前账号绑定问题,
  • ¥15 docker实践项目
  • ¥15 利用pthon计算薄膜结构的光导纳
  • ¥15 海康hlss视频流怎么播放
  • ¥15 Paddleocr:out of memory error on GPU