引用尚未定义的变量 - Java

时间:2013-06-30 22:19:53

标签: java

因为我已经厌倦了解决数学问题,所以我决定尝试一些更具吸引力的东西(即使没有生锈,非常基本的)Java技能。我登陆了一个超级简单的人模拟器,到目前为止,我已经花了很多时间完成各个步骤,让它运行起来。目前,它生成一个人类对象数组,并运行for循环以循环一组操作,这些操作会改变它们之间的关系,我将其存储在2d整数数组中。当它结束时,我会看看他们彼此讨厌多少。有趣的东西。

然而,麻烦已经出现了,因为我希望程序能够清楚地显示正在发生的动作。我认为最好的方法是在我的“action”类中添加一个字符串description(它存储actor,reactor和关系更改量的变量)。这在一定程度上起作用,因为我可以打印一般信息(“战斗已经发生!”)没有问题。然而,理想情况下,我希望它更具体一点(“人A在人B的头上扔了一块石头!”)。后一个目标证明更加困难:尝试使用引用actor和reactor的描述字符串构造一个动作会给我一个很大的错误,“在定义之前不能引用字段”。这很有道理。

我相信我不是完全处于程序员模式,因为我能想到的唯一另一种方法就是一个笨重的switch语句,它不需要每个动作都有自己的包装好的描述。而且必须有一个更简洁的方式。我不是在寻找代码的例子,只是朝着正确的概念方向努力来处理这个问题。

2 个答案:

答案 0 :(得分:2)

哇。相当大的文字墙。因此:

击穿

您的设置

  

目前,它生成一个人类对象数组,并运行一个for循环来循环一系列操作,这些操作会改变它们之间的关系,我将它存储在一个2d整数数组中。

     

我希望程序能够清楚地显示发生时正在发生的动作。

     

我认为最好的方法是在我的“action”类中添加一个字符串描述(它存储actor,reactor和关系更改量的变量)。

听起来你的Action课程到目前为止看起来像这样:

public class Action {
    private String reactor;
    private String actor;
    private double hateMeasure;
    /* Obligatory constructor method, getters, and setters go here */
}

你的麻烦

  

我希望它更具体一点(“A人在B人头上扔了一块石头!”)。

     

...尝试使用引用actor和reactor的描述字符串构造一个动作让我...“在定义之前无法引用字段。”

此时我不太确定您是如何设置参考字段的,以及您是如何遇到此错误的。

我知道你不是在寻找代码,但是你必须意识到让某人进入“程序员模式”的困难,而没有向他们展示一些骨架原理 - 代码。

也许创建一个方法,它接受actor和reactor的两个参数,然后在每个动作发生后调用该方法?

public void reportAction(String reactor, String actor) {
    // do stuff
} 
/* if you're confused by how "reactor" and "actor" have the same names as 
   the instance variables, look into the "this" keyword */

或者(如果您的设置与我从描述中推断出的设置不同,添加那些实例变量然后)您只需在Action类中编写一个不带参数的新方法,只需引用您的实例变量:

public void reportAction() {
    System.out.println(actor + " with " + reactor);
}

现在我发现你可能希望在反应堆和演员之间指定发生了什么而不是简单地说明两个特定的模拟人之间发生了什么。在那种情况下......

public void reportAction() {
    System.out.print(actor);
    // you're going to have to define the change in hateMeasure here
    if( deltaHateMeasure > 0 ) { 
        System.out.print(" had a fight with " + reactor);
    } else { /* print other stuff */ }
}

如果您想简洁地编写代码,那么另一个有趣的事情就是三元运算符。

玩得开心!


编辑:

更好! 在您的班级中添加String descriptor;实例变量!

然后一切都归结为......:

public void reportAction() {
    System.out.println(actor + descriptor + reactor);
}

答案 1 :(得分:0)

我不确定你是如何编写课程的。我是否正确地假设您想要打印字符串时,您确实知道演员和反应堆的名称?

如果是这样,你应该能够沿着这些方向做点什么:

System.out.printf(action.description, actor.name, reactor.name);

在哪种情况下,action.description(或存储描述字符串的位置)类似于:

"%s has thrown a rock at %s's head!";

我希望这有帮助!