import java.util.*;
import java.io.*;
public class LootGenerator{
public static void main (String[] args)
throws FileNotFoundException{
System.out.println("This program simulates the random item generator");
System.out.println("from the game Diablo II. Happy hunting!");
System.out.println();
String file="monstats.txt";
Monster[] array = getArray(file);
//Monster alex=getRandomMonster(array);
}
public Monster getRandomMonster(Monster[] array){
int randMonster = (int)(Math.random() * array.length);
return array[randMonster];
}
public Monster[] getArray (String file)
throws FileNotFoundException{
Scanner sc = new Scanner (new File (file));
Monster[] array = new Monster[sc.nextInt()];
sc.next(); //takes away the word Class
sc.next(); //takes away the word Type
sc.next(); //takes away the word Level
sc.next(); //takes away the word TreasureClass
for(int a = 0; a < array.length; a++)
{
array[a] = new Monster(sc.next(), sc.next(), sc.nextInt(), sc.next());
}
return array;
}
}
class Monster{
private String monsterClass;
private String type;
private int level;
private String treasureClass;
public Monster(String myClass, String myType, int myLevel, String myTreasureClass){
monsterClass = myClass;
type = myType;
level = myLevel;
treasureClass = myTreasureClass;
}
public String getMonsterClass(){
return monsterClass;
}
public String getType(){
return type;
}
public int getLevel(){
return level;
}
public String getTreasureClass(){
return treasureClass;
}
}
我无法弄清楚我的计划有什么问题...有什么建议吗?我一直认为它无法从静态上下文引用 - 即Monster [] array = getArray(file)。该程序的目标是从文本文件中随机生成一个怪物 - 如果您需要查看文本文件本身,则分配在此处:http://www.cis.upenn.edu/~cis110/hw/hw06/index.html
答案 0 :(得分:3)
您尝试从静态方法调用常规方法,这是不可能的。您可以实例化LootGenerator然后调用方法或使方法静态(只需将静态修改器添加到方法中)。
一个解决方案:
public static void main (String[] args)
throws FileNotFoundException {
System.out.println("This program simulates the random item generator");
System.out.println("from the game Diablo II. Happy hunting!");
System.out.println();
String file = "monstats.txt";
LootGenerator lg = new LootGenerator();
Monster[] array = lg.getArray(file);
Monster alex = lg.getRandomMonster(array);
}
您可以找到有关实例和班级成员here的更多信息。
简而言之,实例方法只能在类的实例上调用。静态方法属于该类,可以从任何地方调用,但它们不能访问实例变量或调用实例方法,除非它们实际上具有对类实例的引用。
答案 1 :(得分:2)
get array不是静态方法,需要启动一个对象或使其静态
答案 2 :(得分:1)
getArray
是一种实例方法,您可以从main
调用它,并将其声明为static
。如果您将getArray
更改为静态,则会进行编译。
getRandomMonster
也会遇到同样的问题。
答案 3 :(得分:1)
你应该
public Monster[] getArray (String file)
throws FileNotFoundException
静态,以便您可以从当前正在执行的main()
内部调用它,您不需要实例化类LootGenerator
来调用它(如果方法是静态的,它属于类声明它的地方,可以在不使用该类的任何实例的情况下调用它。)
答案 4 :(得分:1)
您不能直接从静态方法(getArray
)引用与特定对象相关的非静态方法(main
),该方法与特定对象无关。
要修复它,您可以简单地将方法更改为静态:
public static Monster[] getArray (String file) {
// ...
}
答案 5 :(得分:1)
getArray()
和getRandomMonster()
是非静态的 - 它们需要调用对象的实例。您的主要方法是静态的,因此您没有实例。你必须创建它:
LootGenerator generator = new LootGenerator();
generator.getArray(..);
generator.getRandomMonster(..);
答案 6 :(得分:1)
main
函数是static
,这意味着它可以作为一个整体在类上调用,而不仅仅是该类的特定实例。 getArray
未定义为静态,因此如果您调用它,则必须在LootGenerator
的特定实例上调用它,但您尝试在整个类中调用它。我在getArray
中没有看到任何非静态代码,因此您应该能够将其声明为静态。