繁体   English   中英

如何在整个程序中仅创建一个 Scanner 对象

[英]How to create only one Scanner object throughout my program

如何在整个程序中只创建一个Scanner对象,因为自动测试会导致您的程序生成异常并终止。 原因是在自动测试中,多行测试输入一起发送到程序。 它会导致线程“main” java.util.NoSuchElementExceptionerror.Exception java.util.NoSuchElementException

import java.util.Scanner;


public class NimPlayer
{
    public NimPlayer()
    {

    Scanner Keyboard=new Scanner(System.in);
    System.out.println("Please enter Player 1's name:"  );
    String NameofPlayer1=Keyboard.nextLine();
    System.out.println();


    System.out.println("Please enter Player 2's name:"  );
    String NameofPlayer2=Keyboard.nextLine();
    System.out.println();


    do {

    System.out.println("Please enter upper bound of stone removal:");
    int Upperbound=Keyboard.nextInt();
    System.out.println();


    System.out.println("Please enter initial number of stones:");
    int InitialNum=Keyboard.nextInt();


    removeStone(NameofPlayer1,NameofPlayer2,InitialNum,Upperbound);

    System.out.println();
    System.out.println("Do you want to play again(Y/N):");
    }while(Keyboard.next().equalsIgnoreCase("Y"));
}


    public static void removeStone(String NameofPlayer1,String NameofPlayer2,int InitialNum,int Upperbound)
    {
        Scanner Keyboard1=new Scanner(System.in);

        int Roundplayer=1;

        while(InitialNum>0)
        {
            System.out.println();           
            System.out.print(InitialNum+" "+ "stones left:");
            Star(InitialNum);
            System.out.println();

            if(Roundplayer>0)
            {       
                System.out.println(NameofPlayer1+ "'s turn-remove how many?");
                int NumofPlayer1=Keyboard.nextInt();

                while(NumofPlayer1>Upperbound)
                {
                    System.out.println("Larger than upper bound!" +"\nPlease enter it again\n");
                    break;
                }

                Roundplayer=Roundplayer-1;
                InitialNum=InitialNum-NumofPlayer1;
            }

            else 
            {
                System.out.println(NameofPlayer2+ "'s turn-remove how many?");
                int NumofPlayer2=Keyboard1.nextInt();
                Roundplayer=Roundplayer+1;
                InitialNum=InitialNum-NumofPlayer2;
                //System.out.print(InitialNum+ "stones left:");
                //Star(InitialNum);
            }
        }

        if(Roundplayer>0)
        {
            System.out.println();
            System.out.println("Game Over");
            System.out.println(NameofPlayer1+ " "+"wins");
        }
        else {
            System.out.println();
            System.out.println("Game Over");
            System.out.println(NameofPlayer2+ " "+"wins!");
        }   
    }


    public static void Star(int InitialNum )
    {
        for(int i=0; i<InitialNum; i++ )
        {
            System.out.printf(" "+"*");
        }
    }
}

将 Scanner 对象设置为公共静态属性,如

import java.util.Scanner;

public class NimPlayer
{
      public static Scanner Keyboard = new Scanner(System.in);

      public NimPlayer()
      {
          ...
      }
}

确保在程序中也将 Keyboard1 Scanner 更改为 Keyboard。

从构造函数和其他方法中删除创建Scanner 将它作为实例变量放在类中,并在构造函数和其他方法中使用它。

public class NimPlayer {
    Scanner keyboard = new Scanner(System.in);
    public NimPlayer() {
        // You can use keyboard here
    }

    public static void removeStone(String NameofPlayer1,String NameofPlayer2,int InitialNum,int Upperbound) {
        // You can use keyboard here
    }

    //...Other parts of the program
}

我还建议您遵循Java 命名约定,例如您的变量名, Keyboard应该是keyboard

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM