Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行命令时崩溃_Java_Bukkit - Fatal编程技术网

Java 运行命令时崩溃

Java 运行命令时崩溃,java,bukkit,Java,Bukkit,代码 主要类别: ListenerClass: 解释 我正在开发我的插件,目前正在开发创建大厅的部分。基本上,我让它做的是当玩家用位置棒左键点击时,他们设定点1,当他们右键点击时,他们设定点2。我有一个块选择器,它选择第一个块,然后选择Y上的所有块,Z上的所有块,然后是X上的所有块,直到它们等于点2。它将这些块记录到一个HashMap中,这样我可以在需要时调用这些块。我的问题是我认为我有一个无限for循环或类似的东西,因为控制台给了我一个错误。有时它也给我一个更长的堆栈跟踪,我只是对此感到困惑

代码

主要类别: ListenerClass:

解释

我正在开发我的插件,目前正在开发创建大厅的部分。基本上,我让它做的是当玩家用位置棒左键点击时,他们设定点1,当他们右键点击时,他们设定点2。我有一个块选择器,它选择第一个块,然后选择Y上的所有块,Z上的所有块,然后是X上的所有块,直到它们等于点2。它将这些块记录到一个HashMap中,这样我可以在需要时调用这些块。我的问题是我认为我有一个无限for循环或类似的东西,因为控制台给了我一个错误。有时它也给我一个更长的堆栈跟踪,我只是对此感到困惑

所以我想做的是创建一个简单的基础,我将用于我未来所有需要定义区域的插件。当玩家运行命令position时,它会给他们一个工具,让他们选择点。左键单击选择点1,右键单击选择点2。我使用getPoint1和getPoint2获取它们,因为我将这些点存储在HashMap中。一旦玩家选择了点,他们就会运行命令/lobbycreate lobbyname,当他们运行命令时,假设获取并存储给定点内的所有块。为此,我使用了一系列for循环。首先,我有变量blockSelector。我希望blockSelector从getPoint1开始,然后转到getPoint2,选择两点之间的所有块。然后我们转到我的第一个for循环,其中while blockSelector.getBlockX!=getPoint2X,getPoint2X是一个变量,我用来获取getPoint2的X坐标。这一点是,所有这个循环和这个循环中的所有循环都将继续,直到blockSelector和getPoint2X都具有相同的值。在这个循环中,我有另一个循环,除了Z坐标,它做同样的事情,因此它选择Z坐标上的所有块,但只有在它做了循环之后,它才选择Y坐标上的所有块。在完成所有这些之后,根据replaceVar是什么,我加或减1,并重复这个循环,直到blockSelector的所有3个坐标都等于getPoint2,从而保存过程中的所有块。我之所以使用所有这些if语句和replaceVar,是因为在选择坐标时,玩家可以选择负坐标和正坐标,而getPoint1可能大于或小于getPoint2,因此我必须根据2个值进行加减

控制台输出

jobisingh发出的服务器命令:/lobbycreate gulp [09:46:50错误]:服务器已停止响应! [09:46:50错误]:请将此报告给http://www.spigotmc.org/ [09:46:50错误]:确保包括所有相关控制台错误和Minecraft碰撞报告 [09:46:50错误]:插口版本:git-spiget-b2c2c63-a3cb1bc MC:1.8.7 [09:46:50错误]:--------------- [09:46:50错误]:服务器线程转储在向spiget报告之前在此处查找插件!: [09:46:50错误]:--------------- [09:46:50错误]:当前线程:服务器线程 [09:46:50错误]:PID:17 |挂起:假|本机:假|状态:可运行 [09:46:50错误]:堆栈: [09:46:50错误]:java.util.HashMap.putnown源 [09:46:50错误]:me.jobisingh.MainClass.onCommandMainClass.java:223 [09:46:50错误]:org.bukkit.command.PluginCommand.executePluginCommand.java:44 [09:46:50错误]:org.bukkit.command.SimpleCommandMap.dispatchSimpleCommandMap.java:141 [09:46:50错误]:org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommandCraftServer.java:640 [09:46:50错误]:net.minecraft.server.v1_8_R3.PlayerConnection.handleCommandPlayerConnection.java:1149 [09:46:50错误]:net.minecraft.server.v1_8_R3.PlayerConnection.aPlayerConnection.java:984 [09:46:50错误]:net.minecraft.server.v1_8_R3.PacketPlayInChat.aPacketPlayInChat.java:45 [09:46:50错误]:net.minecraft.server.v1_8_R3.PacketPlayInChat.aPacketPlayInChat.java:1 [09:46:50错误]:net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.runSourceFile:13 [09:46:50错误]:java.util.concurrent.Executors$RunnableAdapter.callUnknown源 [09:46:50错误]:java.util.concurrent.FutureTask.runUnknown Source [09:46:50错误]:net.minecraft.server.v1_8_R3.SystemUtils.aSystemUtils.java:19 [09:46:50错误]:net.minecraft.server.v1_8_R3.MinecraftServer.BMinecraftServer.java:714 [09:46:50错误]:net.minecraft.server.v1_8_R3.dicatedserver.BDedicatedServer.java:374 [09:46:50错误]:net.minecraft.server.v1_8_R3.MinecraftServer.AMinecraftServer.java:653 [09:46:50错误]:net.minecraft.server.v1_8_R3.MinecraftServer.runMinecraftServer.java:556 [09:46:50 错误]:java.lang.Thread.runUnknown源 [09:46:50错误]:--------------- [09:46:50错误]:整个线程转储: [09:46:50错误]:--------------- [09:46:50错误]:当前线程:块I/O执行器线程-1 [09:46:50错误]:PID:38 |挂起:假|本机:假|状态:等待 [09:46:50错误]:堆栈: >按任意键继续。
我很确定这三个循环正在无限期地运行:

for(; blockSelector.getBlockX() != getPoint2X; blockSelector.setX(replaceVarX))
{
    for(; blockSelector.getBlockZ() != getPoint2Z; blockSelector.setZ(replaceVarZ) )
    {
        for(; blockSelector.getBlockY() != getPoint2Y; blockSelector.setY(replaceVarY))
        {
            lobbies.put(blockSelector.getBlockY(), blockSelector);
        }
        lobbies.put(blockSelector.getBlockZ(), blockSelector);
    }
    lobbies.put(blockSelector.getBlockZ(), blockSelector);
}
我以X为例,但Y和Z的情况完全相同

您的循环运行时间与replaceVarX!=getPoint2X。 但是,replaceVarX在循环内从不更改,因此有两种可能性:

replaceVarX==getPoint2X 循环运行一次。 replaceVarX!=getPoint2X 循环无限期地运行。 但是,请确保第一种情况永远不会发生:

if(getPoint1X > 0 && getPoint2X > 0 && getPoint1X < getPoint2X)
{
    replaceVarX = blockSelector.getBlockX() + 1;
}
else if(getPoint1X > 0 && getPoint2X > 0 && getPoint1X > getPoint2X)
{
    replaceVarX = blockSelector.getBlockX() - 1;
}
else if (getPoint1X < 0 && getPoint2X < 0 && getPoint1X < getPoint2X)
{
    replaceVarX = blockSelector.getBlockX() + 1;
}
else if (getPoint1X < 0 && getPoint2X < 0 && getPoint1X > getPoint2X)
{
    replaceVarX = blockSelector.getBlockX() - 1;
}
else if (getPoint1X > 0 && getPoint2X < 0)
{
    replaceVarX = blockSelector.getBlockX() - 1;
}
else if (getPoint1X < 0 && getPoint2X > 0)
{
    replaceVarX = blockSelector.getBlockX() + 1;
}
else if (getPoint1Z < 0 && getPoint2Z < 0 && getPoint1Z < getPoint2Z)
{
    replaceVarX = blockSelector.getBlockX() + 1;
}
要解决这个问题,必须在循环中移动所有if/else,以便相应地更新变量。 你必须把它们分开到循环中,这样RePevEARX在外环中被更新,中间的RePevARARZ,并且在内部被替换,否则你会打破外部的两个循环。

一个可能更有效的替代方法是用循环外的变量替换replaceVarX,它定义了x、y和z的方向-1或+1,我将它们分别称为dx、dy和dz,然后用blockSelector.setXblockSelector.getBlockX+dx替换blockSelector.setXreplaceVarX。 通过这种方式,您可以避免大量冗余检查,从而避免这些循环中的计算时间