Java报错Exception in thread "main" java.util.NoSuchElementException

编写Java时,在多个函数中声明了Scanner对象并且最后都使用close()函数关闭了Scanner对象
当第一个定义了Scanner对象的函数运行完毕后,第二个函数运行到含有Scanner对象的输入语句后就会出现以下错误:在这里插入图片描述
当你在前面的语句中关闭了任意一个Scanner对象,Scanner就无法在后面的语句中打开。例如以下代码

import java.util.*;
public class GuessGame {
    private int myGuess,robotGuess;
    public  void Player(){
        System.out.println("请输入你的出拳(1剪刀,2石头,3布)");
        Scanner input = new Scanner(System.in);
        myGuess = input.nextInt();
        input.close();
    }
    public void Robot(){
        robotGuess = (int)(Math.random()*3)+1;// 返回一个随机数,随机数范围为0.0 =< Math.random < 1.0
        switch(robotGuess){
            case 1:System.out.println("机器出拳:剪刀"); break;
            case 2:System.out.println("机器出拳:石头"); break;
            case 3:System.out.println("机器出拳:布");break;
        }
    }
    public void Star(){
        String chose;
        do{
            Player();
            Robot();
            int complete = myGuess - robotGuess;
            switch(complete){
                case -2:System.out.println("胜利\n可以的兄弟");
                case 0:System.out.println("平局\n兄弟,我相信你能行。"); break;
                case -1:System.out.println("失败\n你真衰"); break;
                case 2:System.out.println("失败\n你真衰"); break;
                case 1:System.out.println("胜利\n可以的兄弟"); break;
            }
        System.out.println("还玩吗,兄弟?(yes or no)");
        Scanner string = new Scanner(System.in);
        chose = string.next();
        string.close();
        }while(chose.equals("yes"));
    }

最好的解决办法就是在全局中声明一个静态的Scanner对象,在最后一处需使用Scanner的地方用close()函数关闭它

import java.util.*;
public class GuessGame {
    private int myGuess,robotGuess;
    private static Scanner input = new Scanner(System.in);
    public  void Player(){
        System.out.println("请输入你的出拳(1剪刀,2石头,3布)");
        myGuess = input.nextInt();
    }
    public void Robot(){
        robotGuess = (int)(Math.random()*3)+1;// 返回一个随机数,随机数范围为0.0 =< Math.random < 1.0
        switch(robotGuess){
            case 1:System.out.println("机器出拳:剪刀"); break;
            case 2:System.out.println("机器出拳:石头"); break;
            case 3:System.out.println("机器出拳:布");break;
        }
    }
    public void Star(){
        String chose;
        do{
            Player();
            Robot();
            int complete = myGuess - robotGuess;
            switch(complete){
                case -2:System.out.println("胜利\n可以的兄弟");
                case 0:System.out.println("平局\n兄弟,我相信你能行。"); break;
                case -1:System.out.println("失败\n你真衰"); break;
                case 2:System.out.println("失败\n你真衰"); break;
                case 1:System.out.println("胜利\n可以的兄弟"); break;
            }
        System.out.println("还玩吗,兄弟?(yes or no)");
        chose = input.next();
        }while(chose.equals("yes"));
        input.close();
    }
    public static void main(String args[]){
        GuessGame open = new GuessGame();
        open.Star();
      

    }
} 

这样在运行就没得问题了。

  • 16
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值