【问题标题】:How Can I Input A Custom Class Value Via Scanner?如何通过扫描仪输入自定义类值?
【发布时间】:2017-09-30 01:30:52
【问题描述】:

我正在尝试组合一个小型测试应用程序,该应用程序通过扫描仪获取输入,并通过哈希图和树集将它们放入内存中。

稍后我将搜索、编辑和删除它们(所以基本上是一个 CRUD),它需要 2 个类,一个员工类和一个公司类。我正在尝试为员工输入包含员工的所有信息,包括作为 POJO 中的外部自定义类对象的公司。

它不让我上课施放它,我该怎么办?

这里是 POJO

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;
    private String firstName;
    private String lastName;
    private String ssn;
    private Integer salary;
    private String birthDate;
    private String jobTitle;
    @ManyToOne
    private Company companyName;

   public Employee (String fN, String lN, String SSN, Integer sal, String birth, String jobT, Company compName) {       
    lastName = lN;
    firstName = fN;
    SSN = ssn;
    sal = salary;
    birth = birthDate;
    jobT = jobTitle;
    compName = companyName;
}

public String toString()
{
    return "Employee[Last Name= " + lastName + ", First Name= " + firstName + " SSN= " + ssn + ","
            + "Salary= " + salary + ", Birth Date= " + birthDate + ", Job Title= " + jobTitle + ",]" ;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public String getSsn() {
    return ssn;
}

public void setSsn(String ssn) {
    this.ssn = ssn;
}

public Integer getSalary() {
    return salary;
}

public void setSalary(Integer salary) {
    this.salary = salary;
}

public String getBirthDate() {
    return birthDate;
}

public void setBirthDate(String birthDate) {
    this.birthDate = birthDate;
}

public String getJobTitle() {
    return jobTitle;
}

public void setJobTitle(String jobTitle) {
    this.jobTitle = jobTitle;
}

public Company getCompanyName() {
      return companyName;
 }

public void setCompanyName(Company companyName) {
       this.companyName = companyName;
}
}

这是扫描仪所在类的一部分

        System.out.println("Enter Company Name : ");
          String val7 = input1.nextLine();
          ...             
          Employee newEmp = new Employee(str1,str2, str3,    val4, str5, str6, val7);

如果我传入 str7,它显然会产生错误,因为该方法采用 CompanyName。

任何想法我需要做的 ClassCast 在这里都行不通。

这里编辑是公司类 公共类公司{ @ID @GeneratedValue(策略=GenerationType.AUTO) 私人长ID; 字符串公司名称; 私有字符串描述;

public String getCompanyName() {
    return companyName;
}
public void setCompanyName(String companyName) {
    this.companyName = companyName;
}
public String getDescription() {
    return description;
}
public void setDescription(String description) {
    this.description = description;
}
}

【问题讨论】:

  • 添加完整的 stactrace 和 minimal reproducible example
  • 如果我将 str7 传入。在您的代码中没有任何名为 str7 的内容。虽然Employee 构造函数的第七个参数应该采用Company 类型。
  • 您必须首先创建您的公司(通过您选择的公司构造函数),然后将该公司传递给 Employee 的构造函数!
  • 不清楚问题出在哪里,但是你在构造函数中有一个逻辑错误,这个compName = companyName;应该是相反的......就像这个companyName = compName ;因为你想分配从参数到成员的值,反之亦然
  • 目前还没有堆栈跟踪,在我通过这部分之前无法运行。

标签: java classcastexception


【解决方案1】:

您需要创建 Company 的实例,不要将其作为字符串传递:

System.out.println("Enter Company Name : ");
String val7 = input1.nextLine();
Company company = new Company();
company.setCompanyName(val7);

并在创建Employee 时使用company 而不是val7

Employee newEmp = new Employee(str1,str2, str3,    val4, str5, str6, company);

ALSO你在构造函数中有一个逻辑错误,这个

compName = companyName; 

应该反过来……像这样

companyName = compName; 

因为您想将参数中的值分配给成员,

【讨论】:

    【解决方案2】:

    只有你已经采取了一半的方式:

    • 您使用扫描仪并询问创建该类的新实例所需的值
    • 您验证所有这些值
    • 您使用它们来创建对象

    喜欢:

    while (something) {
      String newFirstName = scanner.next();
      ...
      int newSalary = scanner.nextInt();
      ...
      Employee newGuy = new Employee(newFirstName, ...
    

    换句话说:Scanner 只知道如何提供那些特定的“内置”类型,例如 String、int、float、...

    因此:如果您需要此类类型的聚合,您可以“手动”收集它们。

    在您的情况下:只需先询问公司。含义:让用户先进入公司;并且您的代码创建公司对象。例如,您可以将它们放入Map<String, Company>。现在,在输入员工时,您最后询问公司名称;然后您的代码检索输入名称的 Company 对象。

    【讨论】:

    • 所以不用扫描仪收集它们,而是将它们放入对象中?
    • 查看我的更新。关键是:扫描仪无法将 Company 对象返回给您。只有字符串、数字……所以你需要解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多