[英]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.