2014-11-05 45 views
-1

你能帮助我与我的任务,请IllegalStateException异常:扫描仪关闭,结束应用程序流

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

的屏幕截图显示为:

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: 

它保持运行,不会让我输入一个名字

你能帮我解决它的请求吗SE,我需要把它由下午1点

回答

0
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()

此扫描器执行当前行,并返回跳过的输入信息。此方法返回当前行的其余部分,排除末尾的任何行分隔符。该位置设置为下一行的开头。

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

+0

非常感谢,我得到它只运行了3次,意识到我犯了错误:)你不能告诉我如何使用2个构造函数可以,因为我无法弄清楚这个问题“创建两个类的实例(每个实例都是测试不同的构造函数)并测试每种方法“ – RifferRaffers 2014-11-05 11:27:49

0

结束让我总结一下你所写的内容,希望这会给你一些指点

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

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

一旦你关闭了资源,那么你不应该再次使用它(或关闭它)。我建议两两件事之一:

  1. 创建你的资源,一旦(外循环),使用起来多少次(内循环),然后一旦关闭他们(外循环)
  2. 创建,使用并关闭循环内部的资源(在我看来,这是不太理想的选择)。
+0

我试图把它放在for循环之外,但它仍然保持运行,并且不允许我将数据输入到名称中,我应该提到我只学习使用java。 – RifferRaffers 2014-11-05 10:16:36

+0

欢迎来到编程和调试的世界。你需要的一个非常重要的问题是能够分解一个问题来确定哪里出错的确切位置。程序是否退出?还是在一条线上“卡住”? – Jonny 2014-11-05 10:34:33

相关问题