2015-08-14 219 views
-5

代碼崩潰運行命令時

MainClass:http://pastebin.com/U99LAQ6z
ListenerClass:http://pastebin.com/ZF5i8mw1

說明

我正在我的插件,我目前正在創建的部分大堂。基本上我所做的是當玩家用鼠標左鍵點擊它們設置點1,當他們右鍵單擊他們設置點2.我有一個塊選擇器,選擇第一個塊,然後選擇所有塊Y和Z上的所有塊,然後在X上,直到它們等於點2。它將每個塊記錄到一個HashMap中,以便在需要時再調用塊。我的問題是我認爲我有一個無限循環或類似的東西,因爲控制檯給我一個錯誤。有時它也會給我一個更長的堆棧跟蹤,我只是對此感到困惑。

所以我想要做的是創建一個簡單的基礎,我將用於所有未來的插件,需要定義區域。這是假設當玩家運行命令positionwand它給他們一個工具,讓他們選擇點。左擊選擇point1,右擊選擇point2。我使用getPoint1和getPoint2來獲取它們,因爲我將這些點存儲在HashMap中。一旦玩家選擇了他們運行命令/ lobbycreate(lobbyname)的點,並且當他們運行該命令時,假設獲得並存儲給定點內的所有塊。爲此,我使用一系列的for循環。首先,我有變量blockSelector。我希望blockSelector從getPoint1開始,然後去getPoint2選擇這兩個點之間的所有塊。然後我們去我的第一個循環,而blockSelector.getBlockX()!= getPoint2X,getPoint2X是我用來獲取getPoint2的X座標的變量。這一點就是這樣,所有這個循環和這個循環中的所有循環都將繼續,直到blockSelector和getPoint2X都具有相同的值。在這個循環中,我有另外一個循環,除了使用Z座標之外,還做了同樣的事情,因此它選擇了Z座標上的所有塊,但是隻有在它內部的循環中選擇了Y座標上的所有塊。經過這一切後,我根據replaceVar是什麼來增加或減少1,並重復循環,直到blockSelector的所有3個座標都等於getPoint2,從而保存進程中的所有塊。我擁有所有這些if語句和replaceVar的原因是因爲選擇座標時,玩家可以選擇負座標和正座標,並且getPoint1可以大於或小於getPoint2,所以我必須根據這兩個值進行增加或減少。

控制檯輸出

jobisingh issued server command: /lobbycreate gulp 
[09:46:50 ERROR]: The server has stopped responding! 
[09:46:50 ERROR]: Please report this to http://www.spigotmc.org/ 
[09:46:50 ERROR]: Be sure to include ALL relevant console errors and Minecraft crash reports 
[09:46:50 ERROR]: Spigot version: git-Spigot-b2c2c63-a3cb1bc (MC: 1.8.7) 
[09:46:50 ERROR]: ------------------------------ 
[09:46:50 ERROR]: Server thread dump (Look for plugins here before reporting to Spigot!): 
[09:46:50 ERROR]: ------------------------------ 
[09:46:50 ERROR]: Current Thread: Server thread 
[09:46:50 ERROR]:  PID: 17 | Suspended: false | Native: false | State: RUNNABLE 
[09:46:50 ERROR]:  Stack: 
[09:46:50 ERROR]:    java.util.HashMap.put(Unknown Source) 
[09:46:50 ERROR]:     me.jobisingh.MainClass.onCommand(MainClass.java:223) 
[09:46:50 ERROR]:    org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) 
[09:46:50 ERROR]:    org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) 
[09:46:50 ERROR]:    org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:640) 
[09:46:50 ERROR]:    net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1149) 
[09:46:50 ERROR]:    net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:984) 
[09:46:50 ERROR]:    net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45) 
[09:46:50 ERROR]:    net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) 
[09:46:50 ERROR]:    net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) 
[09:46:50 ERROR]:    java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) 
[09:46:50 ERROR]:    java.util.concurrent.FutureTask.run(Unknown Source) 
[09:46:50 ERROR]:    net.minecraft.server.v1_8_R3.SystemUtils.a(SystemUtils.java:19) 
[09:46:50 ERROR]:    net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:714) 
[09:46:50 ERROR]:     net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) 
[09:46:50 ERROR]:    net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:653) 
[09:46:50 ERROR]:    net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:556) 
[09:46:50 ERROR]:    java.lang.Thread.run(Unknown Source) 
[09:46:50 ERROR]: ------------------------------ 
[09:46:50 ERROR]: Entire Thread Dump: 
[09:46:50 ERROR]: ------------------------------ 
[09:46:50 ERROR]: Current Thread: Chunk I/O Executor Thread-1 
[09:46:50 ERROR]:  PID: 38 | Suspended: false | Native: false | State: WAITING 
[09:46:50 ERROR]:  Stack: 
> Press any key to continue . . . 

回答

1

我敢肯定,這三個迴路將被無限期地運行:

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的環內,從而使變量得到更新因此。
儘管如此,你必須在循環中分割它們,這樣replaceVarX在外部循環中得到更新,replaceVarZ在中間循環中得到更新,replaceVarY在內部循環中得到更新,否則你會破壞外部兩個循環。

A(可能更有效)替代方法是用外循環的變量,它定義對於x,y和z方向(-1+1)取代replaceVarX每個(I會打電話給他們dxdydz ),然後用blockSelector.setX(blockSelector.getBlockX() + dx)代替blockSelector.setX(replaceVarX)
這樣你可以避免很多冗餘檢查(從而計算時間)在這些循環內。