0

我有两个数组,都是int类型。该costs[]数组完美运行,没有错误或错误,但是stands编码完全相同的数组在我定义的方法中给出错误“表达式的类型必须是数组类型,但它解析为 int”底部附近该程序称为buttonFunc. 在该init()方法中,我调用stands[1] = 0并且效果很好,但是当我做几乎相同的事情时(将 1 替换为调用该方法时定义的整数),它给了我错误。为什么语法和用法完全相同的两个数组可以做到这一点?

`import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Canvas;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferStrategy;
import java.text.DecimalFormat;

import javax.swing.Timer;


public class Main extends Applet implements Runnable, ActionListener {
    private static final long serialVersionUID = 1L;

    double money = 0;
    double income = 2; //Actual income is this * 0.4
    //int lemonadeStands = 0;
    int cookieStands = 0;
    int cupcakeStands = 0;
    int cookieCost = 25;
    int cupcakeCost = 75;
    int modifier = 1;

    int[] costs = new int[3];
    int[] stands = new int[3];              //Declaring the array - same as the costs[] array, but it doesn't work?

    Button buyLemonade;
    Button buyCookie;
    Button buyCupcake;

    int time = 0;
    int timeComparison = (int) (Math.random()*50 + 120);

    private Graphics dBufferedGraphic = null;
    private Image dbufferedImage = null;

    public void init() {
        costs[1] = 10;
        stands[1] = 0;                  //No error here?

        setLayout(new FlowLayout());
        buyLemonade = new Button("Buy a Lemonade Stand");
        buyCookie = new Button("Buy a Cookie Stand");
        buyCupcake = new Button("Buy a Cupcake Stand");

        add(buyLemonade);
        add(buyCookie);
        add(buyCupcake);

        buyLemonade.addActionListener(this);
        buyCookie.addActionListener(this);
        buyCupcake.addActionListener(this);

        t.start();
    }

    public void paint(Graphics g) {
        DecimalFormat df = new DecimalFormat("#.##");
        g.drawString("Money: $" + df.format(money), 10, 10);
        g.drawString("Income: $" + income / 2.5 + " per second", 10, 24);
        g.drawString("Lemonade Stands: " + stands[1], 10, 52);
        g.drawString("Cookie Stands: " + cookieStands, 10, 66);
        g.drawString("Cupcake Stands: " + cupcakeStands, 10, 80);
        g.drawString("Cost: " + costs[1], 355, 40);
        g.drawString("Cost: " + cookieCost, 495, 40);
        g.drawString("Cost: " + cupcakeCost, 620, 40);
    }

    public void run() {}
    public void start() {}
    public void stop() {}
    public void destroy() {}

    Timer t = new Timer(50, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            money += income / 50; //0.8 per second
            repaint();
        }
     });

    public void actionPerformed(ActionEvent e) {
        /*if(e.getSource() == buyLemonade) {
            if (money >= lemonadeCost) {
            System.out.println("Lemonade stand bought. ");
            income += 1; //0.4 actual
            lemonadeStands++;
            money -= lemonadeCost;                      Replacing with method.
            lemonadeCost += 4 * modifier; 
            modifier++;
            }else System.out.println("Not enough money! ");
        }*/
        buttonFunc(costs[1], 1, stands[1], 1, "Lemonade stand", 1);
        if(e.getSource() == buyCookie) {
            if (money >= cookieCost) {
            System.out.println("Cookie stand bought. ");
            income += 3;
            cookieStands++;
            money -= cookieCost;
            cookieCost += 8 * modifier;
            modifier += 2;
            }else System.out.println("Not enough money! ");
        }
        if(e.getSource() == buyCupcake) {
            if (money >= cupcakeCost) {
            System.out.println("Cupcake stand bought. ");
            income += 6;
            cupcakeStands++;
            money -= cupcakeCost;
            cupcakeCost += 18 * modifier;
            modifier += 3;
            }else System.out.println("Not enough money! ");
        }
    }

    public void buttonFunc(int cost, int incomeProduced, int stands, int modifierAmount, String name, int arrayLocation) {
        if (money >= cost) {
            System.out.println(name + " bought. ");
            income += incomeProduced;
            stands[arrayLocation] += 1;                 //Where I get the error
            money -= cost;
            costs[arrayLocation] = (int) (costs[arrayLocation]  + costs[arrayLocation] * 0.4);
            modifier += modifierAmount;
        }else System.out.println("Not enough money! ");
    }

    public void update (Graphics g) {
        if (dbufferedImage == null) {
                dbufferedImage = createImage(this.getSize().width, this.getSize().height);
                dBufferedGraphic = dbufferedImage.getGraphics ();
            }
          dBufferedGraphic.setColor(getBackground ());
          dBufferedGraphic.fillRect(0, 0, this.getSize().width, this.getSize().height);

          dBufferedGraphic.setColor(getForeground());
          paint(dBufferedGraphic);

          g.drawImage(dbufferedImage, 0, 0, this);
    }

}
4

2 回答 2

1

您正在传递 stand[1] ,这是一个 int 值而不是数组引用。此外,您在方法buttonFunc声明中接受一个 int 值而不是数组:

public void buttonFunc(int cost, int incomeProduced, int stands, int modifierAmount, String name, int arrayLocation)

由于立场是int这样,以一种形式访问它array会导致该行中的错误:

        stands[arrayLocation] += 1;                 //Where I get the error

此外,您似乎对在类级别定义的方法参数cost和数组感到困惑。costs

于 2013-09-29T07:05:47.060 回答
1

您的方法中有一个带有名称的形式参数stands,它隐藏了数组名称。因此,在您的方法stands中是指形式参数,即 an int,这就是错误的原因。

更改您的形式参数名称,或用于this引用实例数组类型字段stands

this.stands[arrayLocation] += 1;

此外,您似乎甚至没有stands在您的方法中使用该参数。如果您打算在那里传递数组,则将您的方法签名更改为:

public void buttonFunc(int cost, int incomeProduced, int[] stands, ...)

然后调用这个方法:

buttonFunc(costs[1], 1, stands, 1, "Lemonade stand", 1);  // Change stands[1] to stands

您也可以完全删除该方法参数。由于stands是实例引用变量,因此您可以从任何实例方法访问它。此外,修改任何数组索引中的值都将反映在实际数组对象中。因此,只需摆脱stands参数即可。没事的。

于 2013-09-29T07:06:28.877 回答