我一直在尝试为高中的编程课程创建一个游戏,我遇到了一个与在不同类中实例化的对象有关的问题。我的老师一直无法帮助,因为他和我们一起学习"。
public void launchGame(){
ObjectInitialize init = new ObjectInitialize();
init.objectInitialize();
while(year > 1900){
util.checkEvents();
prussia.setTactics(4);
我在另一个调用此方法的类中有一个main方法。此方法的第一件事是创建名为ObjectInitialize
的类init
的新对象。然后我在objectInitialize
上调用init
方法。这是该方法的代码:
public void objectInitialize(){
Country france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800);
Country russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
Country austria = new Country("Austria", 8, 150, 1, 100, 100, 1, 1, 700);
Country prussia = new Country("Prussia", 8, 175, 2, 100, 100, 1, 1, 700);
FranceUI franceUI = new FranceUI();
RussiaUI russiaUI = new RussiaUI();
AustriaUI austriaUI = new AustriaUI();
PrussiaUI prussiaUI = new PrussiaUI();
EventHandlerUI eventHandlerUI = new EventHandlerUI();
GameStartUI gameStartUI = new GameStartUI();
AllianceUI allianceUI = new AllianceUI();
Utilities util = new Utilities();
}
如您所见,此方法会创建许多对象。这种方法没有明显的错误。但是,当我尝试使用util.checkEvents()
或prussia.setTactics(4)
对象/方法时,我的IDE告诉我它找不到符号"。这是因为launchGame()
方法所在的类无法访问在另一个类中创建的对象吗?如果是这样,我该如何解决这个问题?如果有人需要看,我可以发布更多我的代码。谢谢!
修改
我已将最初在objectInitialize()
方法中的所有代码移动到构造函数中,并为外部的每个对象创建了变量,如下所示:
public class objectInitialize {
Country france;
Country russia;
Country austria;
Country prussia;
FranceUI franceUI;
RussiaUI russiaUI;
AustriaUI austriaUI;
PrussiaUI prussiaUI;
EventHandlerUI eventHandlerUI;
GameStartUI gameStartUI;
AllianceUI allianceUI;
Utilities util;
public objectInitialize(){
Country france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800);
System.out.println("france done");
Country russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
System.out.println("russia done");
Country austria = new Country("Austria", 8, 150, 1, 100, 100, 1, 1, 700);
System.out.println("austria done");
Country prussia = new Country("Prussia", 8, 175, 2, 100, 100, 1, 1, 700);
System.out.println("prussia done");
FranceUI franceUI = new FranceUI();
RussiaUI russiaUI = new RussiaUI();
AustriaUI austriaUI = new AustriaUI();
PrussiaUI prussiaUI = new PrussiaUI();
EventHandlerUI eventHandlerUI = new EventHandlerUI();
GameStartUI gameStartUI = new GameStartUI();
AllianceUI allianceUI = new AllianceUI();
System.out.println("ui done");
}
public Country getFrance(){
return france;
}
}
我也创建了返回对象的方法,就像你建议的那样。但是,我仍然遇到问题:
public class Game {
int year = 1836;
int currentTurn = 0;
public void launchGame(){
System.out.println("123");
objectInitialize init = new objectInitialize();
System.out.println("123");
System.out.println(init.france.equip); // <-- Right here is the problem. My IDE
} // is telling me that I have a
} // NullPointerException at this line
即使我将init.france.equip
更改为init.getFrance().equip
,我也会遇到同样的错误。有任何想法吗?以下是Country类的代码:
public class Country {
String name;
int income;
int treasury;
int industry;
int influence;
int prestige;
int tactics;
int equip;
int manpower;
public Country(String startName, int startIncome, int startTreasury, int startIndustry, int startInfluence, int startPrestige, int startTactics, int startEquip, int startManpower){
name = startName;
income = startIncome;
treasury = startTreasury;
industry = startIndustry;
influence = startInfluence;
prestige = startPrestige;
tactics = startTactics;
equip = startEquip;
manpower = startManpower;
}
public int getEquip(){
return equip;
}
当我将.equip
更改为.getEquip
时,我仍然会收到相同的错误。
我认为引用指的是什么?但是,不应该创建init
对象允许我引用国家/地区对象吗?希望这不是一个糟糕的问题,我非常感谢你的所有建议和帮助。
答案 0 :(得分:1)
你需要在某处保存那些初始化的对象。
现在,你的ObjectInitialize()函数会创建一堆对象,然后在方法结束时超出范围。
如果在ObjectInitialize类中将每个对象声明为类变量,则可以按照显示的方式引用它们
public class ObjectInitialize{
public Country france, russia, austria, prussia;
.
.
.
public void objectInitialize(){
france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800);
russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
austria = new Country("Austria", 8, 150, 1, 100, 100, 1, 1, 700);
prussia = new Country("Prussia", 8, 175, 2, 100, 100, 1, 1, 700);
.
.
.
}
}
此外,重新阅读后,我发现您可以通过将该方法作为构造函数来进一步跳过一步。只需将public void ObjectInitialize
更改为public ObjectInitialize()
这样,您可以通过调用ObjectInitialize int = new ObjectInitialize()
来设置所有内容,而无需调用init.ObjectInitialize()
最后,当您想要访问其中的每个国家/地区时,请务必引用它们,例如init.prussia.setTactics()
答案 1 :(得分:1)
McMill! 实际发生的是你正在创建一个对象并且永远不会返回对它的引用。您最好尝试将国家定义为普通班级的一部分。类似的东西:
public class ObjectInitialize(){
Country france,russia,austria,prussia;
...
public void objectInitialize(){
france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800);
russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
austria = new Country("Austria", 8, 150, 1, 100, 100, 1, 1, 700);
prussia = new Country("Prussia", 8, 175, 2, 100, 100, 1, 1, 700);
FranceUI franceUI = new FranceUI();
RussiaUI russiaUI = new RussiaUI();
AustriaUI austriaUI = new AustriaUI();
PrussiaUI prussiaUI = new PrussiaUI();
EventHandlerUI eventHandlerUI = new EventHandlerUI();
GameStartUI gameStartUI = new GameStartUI();
AllianceUI allianceUI = new AllianceUI();
Utilities util = new Utilities();
}
...
}
希望这有帮助!
然后为每个变量添加以下getter:
public Country getPrussia(){
return prussia;
}
并为其他国家重复一遍......
答案 2 :(得分:1)
像这样改变你的课程。在函数外声明变量。并将其公之于众。
public class objectInitialize{
Country france ;
Country russia ;
Country austria ;
Country prussia ;
FranceUI franceUI ;
RussiaUI russiaUI ;
AustriaUI austriaUI ;
PrussiaUI prussiaUI ;
EventHandlerUI eventHandlerUI ;
GameStartUI gameStartUI ;
AllianceUI allianceUI ;
Utilities util ;
public void objectInitialize(){
france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800);
russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
austria = new Country("Austria", 8, 150, 1, 100, 100, 1, 1, 700);
prussia = new Country("Prussia", 8, 175, 2, 100, 100, 1, 1, 700);
franceUI = new FranceUI();
russiaUI = new RussiaUI();
austriaUI = new AustriaUI();
prussiaUI = new PrussiaUI();
eventHandlerUI = new EventHandlerUI();
gameStartUI = new GameStartUI();
allianceUI = new AllianceUI();
util = new Utilities();
}
}
在这里初始化函数内部的变量,更好地使用构造函数而不是
ObjectInitialize init = new ObjectInitialize();
init.objectInitialize();
更改为 public ObjectInitialize(){ //函数的内容被移动到这个类。 }
现在创建一个对象ObjectInitialize init = new ObjectInitialize();
,它将初始化变量。
你可以像这样调用里面的值。 Object.variableName
。
init.russia
这将为您提供俄罗斯的价值,同样可以使用您想要的任何对象。
答案 3 :(得分:0)
您需要在ObjectInitialize类中添加一个getter方法。
所以,
public PrussiaUI getPrussiaUi()
{
return prussiaUi;
}
此外,在构造函数中创建的对象是方法范围。因此,在施工后,他们有资格进行垃圾收集。它们需要移动到类级变量。
构造函数之外需要读取,
private PrussiaUI prussiaUi;
ObjectInitialize()
{
prussiaUi = new PrussiaUi(....)
....
}
答案 4 :(得分:0)
您可以为在ObjectInitialize
类中创建的每个对象设置getter方法,并使用这些getter方法获取所需的对象。
作为一个例子:
public Country getFrance(){
return france;
}
对于每个对象,你可以进入任何其他java类,如:
ObjectInitialize obji = new ObjectInitialize();
Country france = obji.getFrance();
答案 5 :(得分:0)
问题在于,您将france
声明为实例变量,并将其声明为类objectInitialize
的构造函数中的局部变量。所以实际上它们是两个不同的变量。
代表国家的其他变量也会出现同样的问题。
然后,如果您在构造函数中初始化局部变量 france
,那么您将null
声明为实例变量。< / p>
您应该将代码更改为:
public class objectInitialize {
Country france;
Country russia;
...
public objectInitialize(){
//Country france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800); <-- WRONG
france = new Country("France", 10, 200, 2, 100, 100, 1, 1, 800); // <-- CORRECT
System.out.println("france done");
russia = new Country("Russia", 8, 150, 1, 100, 100, 1, 1, 1300);
System.out.println("russia done");
...
}
public Country getFrance(){
return france;
}
}
另外,尝试为您的类使用有意义的名称,objectInitialize
是一个非常糟糕的选择,因为它没有说明此类及其实例的作用是什么。
例如,您可以将其重命名为GameUI
,但这取决于您。
无论您的名字选择是什么,请尝试尊重该语言的惯例。例如,类名应以大写字母开头。