【问题标题】:Error in Java Constructors (cannot find the symbol)Java 构造函数中的错误(找不到符号)
【发布时间】:2014-10-16 05:28:39
【问题描述】:

我创建了一个名为 Invoice 的类,其中包含发票编号、到期余额和 三个字段表示余额到期的月、日和年。 创建一个接受所有五个数据字段的值的构造函数。内 构造函数,使用以下内容将每个参数分配给适当的字段 例外:

  1. 如果发票编号小于 1000,则将发票编号强制为 0。

  2. 如果月份字段小于 1 或大于 12,则强制月份字段为 0。

  3. 如果 day 字段小于 1 或大于 31,则强制 日期字段为 0。

  4. 如果年份字段小于 2011 年或大于 2017 年,则强制年份字段为 0。

在 Invoice 类中,包含一个 display 方法,用于显示一个 发票对象。

import java.util.Scanner;

public class Invoice

{

  private int inNum;
  private double balDue;
  private int m;
  private int d;
  private int yy;

   public void setinNum(int inv)
   {
     inNum = inv;
     if(inv < 1000)
     inv = 0;
   }

   public int getinNum()
   {
     return inNum()
   }

   public void setbalDue(double bal)
   {
     balDue = bal;
   } 

   public double getbalDue()
   {
     return balDue()
   }


   public void setm(int month)
   {
     m = month;
        if(month < 1 || month >12)
        month = 0;
     }

   public int getm()
  {
     return m()
  }

  public void setd(int days)
  {
   d = days;
    if(days < 1 || days > 31)
    days = 0;
   }

  public int getd()
  {
    return d()
  }

  public void setyy(int years)
  {
   yy = years;
    if(years < 2011 || years > 2017)
    years = 0;
  }

 public int getyy()
 {
   return yy()
}



        public static void main(String[] args)
        {
         double inNum;

         int m, d, yy;
         Scanner keyboard = new Scanner(System.in);
         System.out.print("Please type your invoice number: ");
          inNum = keyboard.nextDouble();
         System.out.print("What month is the balance due?(Choose from 1-12) ");
          m = keyboard.nextInt();
         System.out.print("What day is the balance due?(Choose from 1-31) ");
          d = keyboard.nextInt();
         System.out.print("What year is the balance due? (Choose from 2011-2017) ");
          yy = keyboard.nextInt();

        if((inNum >= 1000) && (m <= 12 && d <= 31 && yy >= 2011) && yy <= 2017)
          System.out.print("Your invoice number is " + inNum + " and your balance due is on " +  m + "/" + d + "/" + yy);
        else
          if((inNum >= 1000) && (m<=12 || m <= 0) && (d <= 31 && yy >= 2011) && yy <= 2017)
           System.out.println("Error! Invalid Month Input.");
        else
          System.out.println("Error!"); 



         }

      }

现在我有一个逻辑错误,我试图强制月份输出这个:

  1. 如果发票编号小于 1000,则将发票编号强制为 0。

  2. 如果月份字段小于 1 或大于 12,则强制月份字段为 0。

  3. 如果 day 字段小于 1 或大于 31,则强制 日期字段为 0。

  4. 如果年份字段小于 2011 年或大于 2017 年,则强制年份字段为 0。

但我不知道如何将字段强制为 0。这是我尝试运行时的输出:

请输入您的发票号码:999

余额是几月份到期的?(从1-12中选择)12

余额是哪一天到期?(从 1-31 中选择)2012

余额是哪一年到期的? (从2011-2017中选择)12

您的发票编号是 999.0,您的应付余额是 2012 年 12 月 12 日

【问题讨论】:

  • inNum();不是方法

标签: java


【解决方案1】:

return inNum(); 是问题所在。 inNum 是一个字段而不是一个方法。使用return inNum

【讨论】:

  • 谢谢!我还必须编写一个包含 main() 方法的应用程序,该方法声明了几个 Invoice 对象,证明构造函数中的所有语句都按指定操作。如何在 main() 方法中调用构造函数?
  • @Chrissy - 使用来自main() 的new Invoice() 或new Invoice(argsToConstructor)。将自动调用正确的构造函数。
【解决方案2】:

您尝试以下代码解决您的问题

    public class Invoice
{


  private int inNum;
  private double balDue;
  private int m;
  private int d;
  private int yy;

public Invoice(int inNum, double balDue, int m, int d, int yy) {
    super();
    setInNum(inNum);
    setBalDue(balDue);
    setM(m);
    setD(d);
    setYy(yy);
}


public int getInNum() {
    return inNum;
}




public void setInNum(int inNum) {
    if(inNum < 1000)
        this.inNum = 0;
    else
        this.inNum = inNum;
}




public double getBalDue() {
    return balDue;
}




public void setBalDue(double balDue) {
    this.balDue = balDue;
}




public int getM() {
    return m;
}




public void setM(int m) {
    if(m < 1 || m > 12)
        this.m = 0;
    else
        this.m = m;
}




public int getD() {
    return d;
}




public void setD(int d) {
    if(d < 1 || d > 31)
        this.d = 0;
    else
        this.d = d;

}




public int getYy() {
    return yy;
}




public void setYy(int yy) {
    if(yy < 2011 || yy > 2017)
        this.m = 0;
    else
        this.yy =yy;
}

public static void main(String[] args) {

    Invoice invoice = new Invoice (100, 3000, 14, 29, 2016);
    System.out.println(invoice.getInNum() +" "+ invoice.getBalDue() +" "+ invoice.getM() +" "+ invoice.getD() +" "+ invoice.getYy());


}
}

【讨论】:

  • 谢谢,效果很好!但是,我需要用户能够输入发票编号和余额到期日。我应该添加什么代码?
  • 欢迎您,我建议您使用 java.util 包中的 Scanner 类,以便在我们的程序中导入此包。扫描仪 a = new Scanner(System.in);下面的程序中使用了 Scanner 类的以下方法:- 1) nextInt 输入整数 2) nextFloat 输入浮点数 3) nextLine 输入字符串。主要你应该有这样的字符串文件名;扫描仪输入 = 新扫描仪(System.in); System.out.println("在.txt中输入文件名");文件名 = in.nextLine();
  • 这是我放的 Scanner keyboard = new Scanner(System.in); System.out.print("请输入您的发票号码:"); inNum = 键盘.nextDouble(); System.out.print("余额是几月份到期的?(从1-12中选择)"); m = 键盘.nextInt(); System.out.print("余额是哪天到期?(从1-31中选择)"); d = 键盘.nextInt(); System.out.print("余额是哪一年到期的?(从2011-2017中选择)"); yy = 键盘.nextInt();但它显示错误错误:无法从静态上下文引用非静态变量 inNum
【解决方案3】:

inNum 是一个变量而不是一个方法,所以去掉括号 () :

  return inNum();

改成

  return inNum;

【讨论】:

    【解决方案4】:

    如果您想返回归档inNum 的内容,您必须删除括号:

    public int getinNum()
       {
         return inNum;
       }
    

    【讨论】:

      【解决方案5】:

      返回值时不要在变量名后面写“()”。

      【讨论】:

        【解决方案6】:

        在你的程序中有很多地方你有错误只是将方法替换为简单的变量 下面列出了这些更改:

        return inNum() to return  inNum;
        return balDue() to return  balDue
        return m() to return m
        return d() to return d
        return yy() to return yy
        

        希望修改后能正常使用

        【讨论】:

        • 谢谢!我还必须编写一个包含 main() 方法的应用程序,该方法声明了几个 Invoice 对象,证明构造函数中的所有语句都按指定操作。如何在 main() 方法中调用构造函数?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-16
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 2012-05-23
        • 2018-04-13
        相关资源
        最近更新 更多