以下程序代码 关闭键盘输入 就会出现错误怎么解决? 要如何写关闭键盘代码才不会产生错误?

以下程序代码 关闭键盘输入 就会出现错误怎么解决? 要如何写关闭键盘代码才不会产生错误?

package com.imooc.system;


import java.util.Scanner;


/*老师你好!我这个程序一直有一个问题就是开启键盘输入之后,要在哪个地方关闭键盘呢?

 * 为什么我一旦在一个方法结束之前关闭键盘,就会出现运行错误?

 * 以下需要用到开启键盘的方法当中,关闭键盘的代码被我注释掉了,不然在运行当中就会提示错误,

 * 麻烦老师帮我看看到底是哪里出问题了,谢谢!再次谢谢老师,老师辛苦了!

 * (如果没有解决掉关闭键盘这个问题,文件一直会有一个感叹号!存在,那就不完美了,哈哈!)

 */



public class systemWork {


// 显示用户操作提示信息的方法; (无参无返回值的方法)

public void notice() {

System.out.println("*******************************************************");

System.out.println("  ——  输入1  - 插入数据;");

System.out.println("  ——  输入2  - 显示所有数据;");

System.out.println("  ——  输入3  - 在指定位置插入数据;");

System.out.println("  ——  输入4  - 查询能被3整除的数据;");

System.out.println("  ——  输入0  - 退出管理;");

System.out.println("*******************************************************");

System.out.println("请输入您要操作的对应数字键:");

}


// 插入数据的方法;(有参有返回值的方法)

public int[] insertData(int length) {

int[] a = new int[length]; // 声明一个长度为length的整形数组;

Scanner sc1 = new Scanner(System.in); // 开启键盘;

if (a[a.length - 1] == 0) { // 判断数组是否为空,为空则输入数组元素并遍历输入数组内容;

for (int i = 0; i < a.length - 1; i++) {

System.out.println("请输入第" + (i + 1) + "个元素");

int n = sc1.nextInt();

if (n != 0) {

a[i] = n;

} else {

do {

System.out.println("数组元素默认值为0,所以请重新输入其它合法数值");

int n1 = sc1.nextInt();

if (n1 != 0) {

a[i] = n1;

break;

}

} while (true);

}


}


System.out.println("输入的数组元素为: ");

for (int i = 0; i < a.length - 1; i++) {

System.out.print(a[i] + "  ");

}

System.out.println(); // 换行

} else { // 不为空则遍历所有数组内容;

System.out.println("数组元素已经存在,具体元素如下: ");

for (int i : a) {

System.out.print(a[i] + "  ");

}

System.out.println(); // 换行

}

// sc1.close(); // 老师!这里怎么关闭键盘;如果在这里加入这段代码后就会出错???

notice(); // 输出提示信息;

return a; // 返回当前a数组;


}


// 显示用户为数组插入的所有数据;

public void showData(int[] a, int length) {


if (a[0] != 0) {

System.out.println("数组元素的内容为:");

for (int i = 0; i < length; i++) {

if (a[i] != 0) {

System.out.print(a[i] + "  ");

}

}

} else {

System.out.println("数组为空不能显示,请按1键,插入数据方可操作!");

}

System.out.println(); // 换行

notice(); // 输出提示信息;

}


// 在指定位置修改数据;

public void insertAtArray(int[] a, int n, int k) {

if (a[0] != 0) {

System.out.println("请输入要修改数据的值:");

Scanner sc2 = new Scanner(System.in);

n = sc2.nextInt();

     if(n!=0) {

System.out.println("请输入要修改的位置:");

k = sc2.nextInt();

if (k < a.length) {

a[k] = n;

System.out.println("恭喜!a[" + k + " ]的值已经成功修改为:" + a[k]);

} else {

       do {

System.out.println("输入的数值不在数值的长度范围,请重新输入要修改的位置!");

int k1 = sc2.nextInt();

if (k1 < a.length) {

a[k1] = n;

System.out.println("恭喜!a[" + k1 + " ]的值已经成功修改为:" + a[k1]);

break;

}    

       }while(true);

}

     }else {

     do {

System.out.println("数组元素默认值为0,所以请重新输入其它合法数值");

int n1 = sc2.nextInt();

if (n1 != 0) {

System.out.println("请输入要修改的位置:");

k = sc2.nextInt();

if (k < a.length) {

a[k] = n1;

System.out.println("恭喜!a[" + k + " ]的值已经成功修改为:" + a[k]);

} else {

do {

System.out.println("输入的数值不在数值的长度范围,请重新输入要修改的位置!");

int k1 = sc2.nextInt();

if (k1 < a.length) {

a[k1] = n1;

System.out.println("恭喜!a[" + k1 + " ]的值已经成功修改为:" + a[k1]);

break;

}  

       }while(true);

}

break;

}

} while (true);

     }

} else {

System.out.println("数组为空不能修改,请按1键,插入数据方可操作!");

}

notice(); // 输出提示信息;

// sc2.close(); //老师!这里怎么关闭键盘;如果在这里加入这段代码后就会出错???


}


// 判断数组中有没有能被num整除的数值,有的话返回true,没有则返回false;

public boolean divNum(int[] a, int num) {

boolean flag = false;

for (int i = 0; i < a.length; i++) {

if (a[i] % num == 0 && a[i] != 0) {

flag = true;

break;

}

}

return flag;

}


// 查出数组中是否能被三整除的元素,并显示输出;

public void divThree(int[] a, int num) {

boolean flag = divNum(a, num); // 通过判断方法,返回有没有能过被num整数的元素真假

if (flag) {

System.out.println("搜索数组中能过被 " + num + " 整除的数值有:");

for (int i = 0; i < a.length; i++) {

if (a[i] % num == 0 && a[i] != 0) {

System.out.print(a[i] + "   ");

}

}

} else {

System.out.println("数组为空 或 在数组中没有找到能被 " + num + " 整除的数值");

}

System.out.println();

notice(); // 输出提示信息;


}


// ----------------------------------------------------以下是主方法-------------------------------------------------------


public static void main(String[] args) {


int[] arr = new int[10]; // 创建一个数组长度为10的整形数组

systemWork sw = new systemWork(); // 创建对象

sw.notice(); // 显示用户提示信息

Scanner sc = new Scanner(System.in); // 开启键盘;

while (true) {

int n = sc.nextInt();

switch (n) {

case 1:

arr = sw.insertData(arr.length); // 传入数组长度并插入数据,返回数组信息

break;

case 2:

sw.showData(arr, arr.length); // 显示返回指定长度的所有数组元素

break;

case 3:

sw.insertAtArray(arr, 22, 2);

break;

case 4:

sw.divThree(arr, 3); // 传参并显示返回数组中能被num整除的数值;

break;

case 0:

sc.close();

System.out.println("退出程序!");

System.exit(0);

default:

System.out.println("非法数值,请重新输入!");

continue;

}


}


}


}


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
好帮手慕珊 2017-08-21 15:41:11

写了一段代码,你可以参考一下,没有任何感叹号。

import java.util.Scanner;
public class Demo {
static Scanner sc=new Scanner(System.in);
public void display(){
int n=sc.nextInt();
System.out.println(n);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String s= sc.next();
System.out.println(s);
sc.close();
}
}


提问者 qq_绿色空间装饰设计中心_0 2017-08-21 15:18:00

老师你好,我按照您说的方法把这段代码放在类定义的开始,但是还是一样的感叹号提示 ,并没有改变?

好帮手慕珊 2017-08-21 10:36:17

Scanner确实有这个问题,有多个Scanner对象的时候,只要一个调用了close();方法,则所有的都关闭了。

解决的办法是,可以在主方法的最后调用close()方法

如果不想看到警告信息,就把Scanner定义成全局变量,然后在主方法最后关闭。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 老师你好!具体要怎么设置为全局变量呢?代码怎么写呢?要如何操作?
    2017-08-21 11:44:31
  • 把static Scanner sc=new Scanner(System.in);写到类定义的最开始,也就是这条注释的上面// 显示用户操作提示信息的方法; (无参无返回值的方法),因为要在主方法中使用,所以要加static
    2017-08-21 12:06:18
  • 老师你好,我按照您说的方法把这段代码放在类定义的开始,但是还是一样的感叹号提示 ,并没有改变?
    2017-08-21 15:18:33
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师