我非常清楚这个错误,但这是我曾经难倒的一次。我知道我不能从main方法调用非静态变量,但这很令人困惑。也许你可以帮忙吗?该错误显示在addInv(1);
行...
代码:
import java.io.*;
import java.util.*;
import javax.swing.*;
public class item
{
public static int attack, defense;
public static ArrayList<String> arr;
public static String name, desc, typeOf, attackAdd, defenseAdd, canSell, canEat,earnedCoins,canEquip;
String stats[];
public static void main(String args[])
{
addInv(1);
}
public void addInv(int e) {
String iname = getItem(1)[0];
String idesc = getItem(1)[1];
int itypeOf = Integer.parseInt(getItem(1)[2]);
int iattackAdd = Integer.parseInt(getItem(1)[3]);
int idefenseAdd = Integer.parseInt(getItem(1)[4]);
boolean icanSell = Boolean.parseBoolean(getItem(1)[5]);
boolean icanEat = Boolean.parseBoolean(getItem(1)[6]);
int iearnedCoins = Integer.parseInt(getItem(1)[7]);
attack = attack + iattackAdd;
defense = defense + idefenseAdd;
System.out.println("You picked up: " + iname);
arr.add("dan");
System.out.println("Description: " + idesc);
}
// Types of Items
// 0 - Weapon
// 1 - Food
// 2 - Reg Item
// 3 - Helmet
// 4 - Armor Legs
// 5 - Chest Armor
// 6 - Shield
public String[] getItem(int e) {
String[] stats = new String[7];
String name = "Null";
String desc = "None";
String typeOf = "0";
String attackAdd = "0";
String defenseAdd = "0";
String canSell = "true";
String canEat = "false";
String earnedCoins = "0";
if (e == 1) {
name = "Pickaxe";
desc = "Can be used to mine with.";
typeOf = "2";
attackAdd = "2";
earnedCoins = "5";
}
return new String[] { name, desc, typeOf, attackAdd, defenseAdd, canSell, canEat, earnedCoins};
}
}
感谢。
答案 0 :(得分:3)
您无法从静态方法调用非静态方法。所以要么addInv
静态:
public class Item {
...
public static void main(String args[]) {
addInv(1);
}
public static void addInv(int e) {
...
}
public static String[] getItem(int e) {
...
}
}
但是将所有这些方法设置为静态可能不合适,您可能更喜欢在Item
中使用main
实例:
public class Item {
...
public static void main(String args[]) {
Item item = new Item();
item.addInv(1);
}
}
顺便说一句,我并不是说要粗鲁,但你应该认真研究你的(糟糕的)代码格式和约定,无论是对于读者还是对你而言。
答案 1 :(得分:1)
static意味着它是一个类变量或方法,这意味着该方法或变量在类的所有实例之间共享。这也意味着您不需要实例化该类来调用该方法。注意:除非你有充分的理由让事情变得静态,否则它通常不是一个好主意,因为它会产生一堆全局变量和函数。
解决此问题的正确方法是在main中创建类的实例,然后在实例上调用该方法。
注意2:如果你有多个线程,静态变量会遇到问题,这意味着你需要在这些线程之间同步读写。
我会看一下:http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/java/javaOO/classvars.html
编辑:这是没有静态的代码,似乎有效。
import java.util.ArrayList;
public class Item
{
public int attack, defense;
public ArrayList<String> arr = new ArrayList<String>();
public String name, desc, typeOf, attackAdd, defenseAdd, canSell,
canEat, earnedCoins, canEquip;
String stats[];
public static void main(String args[])
{
Item anItem = new Item();
anItem.addInv(1);
}
public void addInv(int e)
{
String iname = getItem(1)[0];
String idesc = getItem(1)[1];
// Never read
//int itypeOf = Integer.parseInt(getItem(1)[2]);
int iattackAdd = Integer.parseInt(getItem(1)[3]);
int idefenseAdd = Integer.parseInt(getItem(1)[4]);
// Never read
//boolean icanSell = Boolean.parseBoolean(getItem(1)[5]);
// Never Read
//boolean icanEat = Boolean.parseBoolean(getItem(1)[6]);
// Never Read
//int iearnedCoins = Integer.parseInt(getItem(1)[7]);
attack = attack + iattackAdd;
defense = defense + idefenseAdd;
System.out.println("You picked up: " + iname);
arr.add("dan");
System.out.println("Description: " + idesc);
}
// Types of Items
// 0 - Weapon
// 1 - Food
// 2 - Reg Item
// 3 - Helmet
// 4 - Armor Legs
// 5 - Chest Armor
// 6 - Shield
public String[] getItem(int e)
{
// Never read
// String[] stats = new String[7];
String name = "Null";
String desc = "None";
String typeOf = "0";
String attackAdd = "0";
String defenseAdd = "0";
String canSell = "true";
String canEat = "false";
String earnedCoins = "0";
if (e == 1) {
name = "Pickaxe";
desc = "Can be used to mine with.";
typeOf = "2";
attackAdd = "2";
earnedCoins = "5";
}
return new String[] { name, desc, typeOf, attackAdd, defenseAdd,
canSell, canEat, earnedCoins };
}
}
答案 2 :(得分:1)
public static void main(String args[])
{
item it = new item();
it.addInv(1);
}
答案 3 :(得分:1)
你不能在main中调用一个与这样的对象无关的方法。 你需要打电话:
item.addInv(1);
这意味着你的public void addInt(int e)需要是静态的:
public static void addInt(int e)
这意味着您需要更改该方法的实现,因为您在那里混合了一些概念。
基本上,静态方法是属于它们所在类的方法,因此它们并不特定于该类的任何对象。可以使用类名后跟一个点和方法名来调用此类方法,并且它们的实现不应使用特定的对象值,因为这些方法本身不与类中的任何特定对象相关联。
希望有所帮助