【问题标题】:IllegalStateException: Scanner closed and Ending application program flow [duplicate]IllegalStateException:扫描仪关闭并结束应用程序流程[重复]
【发布时间】:2014-11-05 09:44:49
【问题描述】:

你能帮我完成我的任务吗

编写一个程序来测试下面定义的 Person 类。您的测试程序应该创建该类的两个实例(每个实例用于测试不同的构造函数)并测试每个方法。您还需要说明尝试从客户端类访问私有数据成员时的错误(为清楚起见,暂时将私有修饰符更改为公共并再次测试)。有关示例输出,请参见下面的屏幕截图。

屏幕截图显示为:

p1 name = Not Given Age = 0 Gender = U
p2 name = Jane Doe Age = 0 Gender = F
p1 name = John Doe Age = 25 Gender = M

 PersonTester.jave:20: name has private access in Person
        System.out.println("p2 name = " + p2.name + "Age = " + p2.age + "Gender = " + p2.gender);

 PersonTester.jave:20: age has private access in Person
        System.out.println("p2 name = " + p2.name + "Age = " + p2.age + "Gender = " + p2.gender);

PersonTester.jave:20: gender has private access in Person
        System.out.println("p2 name = " + p2.name + "Age = " + p2.age + "Gender = " + p2.gender);

3 errors

这是给定的类

class Person {

    // Data Members 
    private String name; // The name of this person
    private int age; // The age of this person
    private char gender; // The gender of this person

    // Default constructor
    public Person() {
        name = "Not Given";
        age = 0;
        gender = 'U';
    }

    // Constructs a new Person with passed name, age, and gender parameters.
    public Person(String personName, int personAge, char personGender) {
    name = personName;
    age = personAge;
    gender = personGender; 
    } 

    // Returns the age of this person.
    public int getAge( ) {
        return age;
    }

    // Returns the gender of this person.
    public char getGender( ) {
        return gender;
    }

    // Returns the name of this person.
    public String getName( ) {
        return name;
    }

   // Sets the age of this person.
   public void setAge( int personAge ) {
        age = personAge;
   }

   // Sets the gender of this person.
   public void setGender(char personGender) {
       gender = personGender;
   }

   // Sets the name of this person.
   public void setName( String personName ) {
       name = personName;
   }

} // end class

这就是我所做的

import java.util.Scanner;

public class Person_Tester { 

static char gender;

    public static void main(String [] args){ 

        //Create Array
        Person[] p1 = new Person[2]; 
        Person[] p2 = new Person[1];

      try(Scanner string_input = new Scanner(System.in); 
         Scanner int_input = new Scanner(System.in)) {

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

            Person person1 = new Person(); 

            Person person2 = new Person();

            //Enter Details For Person1

            System.out.println("P1 Name: "); 

            person1.setName(string_input.nextLine()); 

            System.out.println("Age: "); 

            person1.setAge(string_input.nextInt()); 

            System.out.println("Gender: "); 

            gender = string_input.next().charAt(0);

            System.out.println(); 

            //Enter Details For Person2 

            System.out.println("P2 Name: "); 

            person2.setName(string_input.nextLine()); 

            System.out.println("Age: "); 

            person2.setAge(string_input.nextInt()); 

            System.out.println("Gender: "); 

            gender = string_input.next().charAt(0);  

            System.out.println(); 

            string_input.close();
            int_input.close();

        }

      }//end for loop 

    }//end main method

}//end class

当我运行代码时,这就是我得到的

Name: 
John Doe
Age: 
22
Gender: 
M

Name: 
Age: 
21
Gender: 
F

Exception in thread "main" java.lang.IllegalStateException: Scanner closed
    at java.util.Scanner.ensureOpen(Unknown Source)
    at java.util.Scanner.findWithinHorizon(Unknown Source)
    at java.util.Scanner.nextLine(Unknown Source)
    at Person_Tester.main(Person_Tester.java:26)
Name:

我试过取出来

string_input.close();
int_input.close();

我明白了

Name: 
john doe
Age: 
22
Gender: 
m

Name: 
Age: 
21
Gender: 
f

Name: 
Age: 
21
Gender: 
f

Name: 
Age: 
23
Gender: 
m

Name: 
Age: 

它一直在运行,不会让我输入名称

你能帮我修一下吗,我需要在下午 1 点之前完成

【问题讨论】:

    标签: java


    【解决方案1】:
      System.out.println("Age: ");
    
        person1.setAge(Integer.parseInt(string_input.nextLine()));
    
        System.out.println("Gender: ");
    
        gender = string_input.nextLine().charAt(0);
    

    始终使用 nextLine,因为当您使用 Scanner.nextInt() 然后调用 Scanner.nextLine() 时,它将从您读取 int 的行返回该行的剩余部分,该行基本上是一个空字符串。

    nextLine() 的 Javadoc

    将此扫描器前进到当前行并返回被跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。位置设置为下一行的开头。

    由于此方法继续搜索输入以查找行分隔符,因此如果不存在行分隔符,它可能会缓冲所有搜索要跳过的行的输入。

    【讨论】:

    • 非常感谢,我只运行了 3 次,意识到我在哪里犯了错误 :) 你不能告诉我如何使用 2 个构造函数,因为我想不通问题是“创建类的两个实例(每个实例测试不同的构造函数)并测试每个方法”
    【解决方案2】:

    让我总结一下你写的东西,希望它能给你一些指导

    resource = CreateResource();
    for(...) {
      UseResource();
      resource.Close();
    }
    

    首先,您创建一个资源(string_inputint_input)。然后你进入循环。在循环中使用资源,然后关闭资源,然后再次使用资源,然后再次关闭它。

    一旦您关闭了资源,您就不应再次使用它(或关闭它)。我会推荐以下两件事之一:

    1. 创建一次资源(循环外),多次使用(循环内),然后关闭一次(循环外)
    2. 在循环内创建、使用和关闭资源(我认为这是不太理想的选择)。

    【讨论】:

    • 我尝试将它放在 for 循环之外,但它仍然在运行,并且不允许我在名称中输入数据,我可能应该提到我只是在学习使用 java。
    • 欢迎来到编程和调试的世界。您将需要的一个非常重要的问题是能够分解问题以确定出错的确切点。程序是否退出?还是“卡在”一条线上?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多