На нестатический метод Java addInv (int) нельзя ссылаться из статического контекста - PullRequest
0 голосов
/ 17 июля 2010

Я очень хорошо знаю эту ошибку, но сейчас я в тупике. Я знаю, что не могу вызывать нестатические переменные из основного метода, но это сбивает с толку. Может быть, вы можете помочь? Эта ошибка отображается в строке 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};

    }

}

Спасибо.

Ответы [ 4 ]

3 голосов
/ 17 июля 2010

Нельзя вызывать нестатический метод из статического метода. Так что либо сделайте 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 голос
/ 17 июля 2010

Вы не можете вызвать метод main, который не связан с таким объектом. Вам нужно было позвонить:

item.addInv(1);

, что означает, что ваш публичный void addInt (int e) должен быть статическим:

public static void addInt(int e)  

Это означает, что вашу реализацию этого метода нужно будет изменить, потому что вы смешиваете некоторые понятия там.

По сути, статические методы - это методы, принадлежащие к классу, в котором они находятся, и поэтому они не относятся к какому-либо объекту этого класса. Такие методы можно вызывать с использованием имени класса, за которым следуют точка и имя метода, и их реализация не должна использовать конкретные значения объекта, поскольку сами эти методы не связаны с какими-либо конкретными объектами из класса.

Надеюсь, это поможет

1 голос
/ 17 июля 2010
    public static void main(String args[])
    {
        item it = new item();
        it.addInv(1);
    }
1 голос
/ 17 июля 2010

static в Java означает, что это переменная класса или метод, то есть метод или переменная являются общими для всех экземпляров класса. Это также означает, что вам не нужно создавать экземпляр класса для вызова метода. ПРИМЕЧАНИЕ. Если у вас нет веской причины делать вещи статичными, это, как правило, не очень хорошая идея, поскольку создает кучу глобальных переменных и функций.

Правильный способ решения этой проблемы - создать экземпляр вашего класса в 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 };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...