繁体   English   中英

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

[英]How to call a non static method from a class?

我有一个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(counter,spawn,color,world);”处获得了NPE。 只能起源于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

也许我有点困惑,但是您将loadSpawner作为实例方法,并且希望它可以从类中进行访问,或者希望在不创建对象spawnerObject的情况下使用它?

尝试将其更改为

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

那你可以用

Spawner.loadSpawner()

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

公共静态Spawner spawnerObject = new Spawner();

像这样的外侧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;
        }
    }
}

栈跟踪说,例外是在抛出线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);

为避免再次提出此类问题,我建议您学习如何自己阅读stacktrace

通常,我这样做(将其放在Spawner类中):

public static Spawner spawn;

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

现在您可以执行以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM