如何从类中调用非静态方法?

时间:2015-03-14 10:28:53

标签: java plugins bukkit

我有一个run()方法,它每秒运行一次,它必须将数据(例如自计时器启动以来的当前时间,以秒为单位)传递给另一个类'Spawner'中的方法。

运行方法:

@Override
public void run() { 
    counter++;
    if(Main.running[0] == true)
    {
        color = "Red";
        spawn = "base";
        world = "world";
        Spawner spawnerObject = new Spawner();
        spawnerObject.loadSpawner(counter, spawn, color, world);
        run[0]++;
        if(run[0] == 30)
        {
            Main.running[0] = false;
            run[0] = 0;
        }
    }
}

我不确定,但我得到的是'spawnerObject.loadSpawner(计数器,spawn,颜色,世界);'只能在spawnerObject上有它的起源。

我想要的只是每秒运行一次该方法,但我无法弄清楚如何从'Spawner'调用非静态方法。这是方法:

public void loadSpawner(Integer counter, String spawner, String color, String world)
{ //code        
}

有人可以告诉我如何调用该方法吗?我当前使用spawnerObject的事情可能非常糟糕。

错误/堆栈跟踪:

[10:39:24] [Server thread/WARN]: [ColorKeyBattle] Task #5 for ColorKeyBattle v1.0 generated an exception
java.lang.NullPointerException
    at org.Ziron5.main.Spawner.loadSpawner(Spawner.java:79) ~[?:?]
    at org.Ziron5.main.TimerClass.run(TimerClass.java:59) ~[?:?]
    at org.bukkit.craftbukkit.v1_8_R1.scheduler.CraftTask.run(CraftTask.java:71) ~[start.jar:git-Spigot-952179b-43207df]
    at org.bukkit.craftbukkit.v1_8_R1.scheduler.CraftScheduler.mainThreadHeartbeat(CraftScheduler.java:350) [start.jar:git-Spigot-952179b-43207df]
    at net.minecraft.server.v1_8_R1.MinecraftServer.z(MinecraftServer.java:698) [start.jar:git-Spigot-952179b-43207df]
    at net.minecraft.server.v1_8_R1.DedicatedServer.z(DedicatedServer.java:316) [start.jar:git-Spigot-952179b-43207df]
    at net.minecraft.server.v1_8_R1.MinecraftServer.y(MinecraftServer.java:623) [start.jar:git-Spigot-952179b-43207df]
    at net.minecraft.server.v1_8_R1.MinecraftServer.run(MinecraftServer.java:526) [start.jar:git-Spigot-952179b-43207df]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_40]

完成loadSpawner()方法:

这是一个很长的方法所以我把它放在pastebin上:http://pastebin.com/iDNDSQQc

4 个答案:

答案 0 :(得分:0)

也许我有点困惑,但你有loadSpawner作为一个实例方法,并且你希望它可以从类右边访问,或者可以在不创建对象spawnerObject的情况下使用它?

尝试将其更改为

public static void loadSpawner(Integer counter, String spawner, String color, String world)
{ 
//code        
}

然后你可以用

来调用它
Spawner.loadSpawner()

答案 1 :(得分:0)

不要在运行中一次又一次地为Spawner创建对象,这将在每次进入run()时生成spawner类的新实例。 使用

public static Spawner spawnerObject = new Spawner();

out side run()就像这样

public static Spawner spawnerObject = new Spawner();
   @Override
public void run() { 
    counter++;
    if(Main.running[0] == true)
    {
        color = "Red";
        spawn = "base";
        world = "world";
        spawnerObject.loadSpawner(counter, spawn, color, world);
        run[0]++;
        if(run[0] == 30)
        {
            Main.running[0] = false;
            run[0] = 0;
        }
    }
}

答案 2 :(得分:0)

堆栈跟踪表示在类79的行Spawner处抛出异常,这是loadSpawner方法的一部分。

if(plugin.getLoc(world, "Basespawners", color, "loc1", "Y") < plugin.getLoc(world, "Basespawners", color, "loc2", "Y"))

此时的任何变量都可能是null。 调试你的代码。

System.out.println(plugin);
System.out.println(world);
System.out.println(color);

为避免再次提出此类问题,我建议您自己学习how to read stacktraces

答案 3 :(得分:0)

通常我这样做(把它放在Spawner类中):

public static Spawner spawn;

public Spawner getSpawner() {
    if(spawn == null) {
        spawn = new Spawner();
    }
return spawn;
}

现在你可以做到:

Spawner.getSpawner().loadSpawner(...);