Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用Scanner作为构造函数的参数_Java_Constructor_Java.util.scanner - Fatal编程技术网

Java使用Scanner作为构造函数的参数

Java使用Scanner作为构造函数的参数,java,constructor,java.util.scanner,Java,Constructor,Java.util.scanner,这是一个学校作业的问题,这就是为什么我这样做的原因 无论如何,我在main方法(scanner Stdin=newscanner(System.in);是行)中使用Stdin制作了一个扫描仪,从程序运行时指定的txt读取数据。此扫描器在main中按预期工作,但是我需要在将Scanner作为参数的自定义类中使用它: public PhDCandidate(Scanner stdin) { name = stdin.nextLine(); System.out.p

这是一个学校作业的问题,这就是为什么我这样做的原因

无论如何,我在main方法(scanner Stdin=newscanner(System.in);是行)中使用Stdin制作了一个扫描仪,从程序运行时指定的txt读取数据。此扫描器在main中按预期工作,但是我需要在将Scanner作为参数的自定义类中使用它:

    public PhDCandidate(Scanner stdin)
    { 

    name = stdin.nextLine();
    System.out.println(name); //THIS NEVER RUNS
    preliminaryExams = new Exam[getNumberOfExams()];

    for(int i = 0; i <= getNumberOfExams(); i++)
    {
        preliminaryExams[i] = new Exam(stdin.nextLine(), stdin.nextDouble());
    }
    System.out.print("alfkj");
   }
公共PhDCandidate(扫描仪标准)
{ 
name=stdin.nextLine();
System.out.println(name);//这永远不会运行
preliminaryExams=新考试[getNumberOfExams()];

对于(int i=0;i您的代码对我来说运行良好。在主窗口中创建扫描仪后,将其作为参数传递

 public Test(Scanner stdin)
        { 
System.out.println("enter something");
        name = stdin.nextLine();
        System.out.println(name); //THIS NEVER RUNS


        System.out.print("alfkj");
       }
    public  static void main(String...args)throws SQLException {
        new Test(new Scanner(System.in));
}

output: enter something
        xyzabc
        alfkj

在PhDCandidate类中添加一个set Name方法。通过这种方式,您可以在main方法中创建一个PhDCandidate对象,并打印名称或从main执行任何操作

public static void main(String[] args) {

    PhDCandidate c = new PhDCandidate();
    c.setName(stdin.nextLine());
}

在调用构造函数之前,请确保您没有关闭并重新初始化
扫描仪stdin
,因为我怀疑这就是问题所在,即如果您正在执行以下操作:

        Scanner stdin = new Scanner(System.in);
        .........
        stdin.close(); //This will close your input stream(System.in) as well  

        .....
        .....

        stdin = new Scanner(System.in);
        PhDCandidate phDCandidate = new PhDCandidate(stdin);

stdin
构造器内部将不会读取任何作为输入流的内容
系统。in
已关闭。

“此时,扫描仪的任何调用都将结束程序,不会引发异常或错误。”具体在什么时候?程序在代码中的什么地方结束?我不认为您的程序实际上已终止。我认为您的控制台正在等待输入。请尝试在控制台上输入一些名称。@code Guru:每当我尝试使用扫描程序时(除了stdin.next(),所有其他方法都会中断),程序就会结束,因此,在尝试使用.nextLine()时,您立即解决了问题吗?嘿,谢谢大家的帮助。事实证明,问题出在考试类上,以及扫描仪的工作方式上。发生的事情是,当我在main中调用nextLine()时(以及所示代码中的nextDouble()),它读取int(或double)但不会前进到下一行。这导致后续的nextLine()调用返回空字符串,因为没有剩余内容,但扫描仪所在的行仍然没有前进到新的行字符之前,并且txt中的每个标记都在不同的行上。S0是的,我遇到了一个愚蠢的问题。问题是,尽管使用了System.in(),它实际上是从一个.txt文件中读取的。如果我要用Scanner stdin=new Scanner(新文件(“file.txt”)替换扫描仪结构,那么扫描仪仍以相同的方式运行。