2016-04-30 89 views
0

由於某種原因,Java給了我一個NullPointerException。我知道這通常很容易解決,但在這種情況下,我無法弄清楚爲什麼它把它放在首位。爲什麼我無法弄清楚?那麼,因爲它沒有堆棧跟蹤!這裏是我的代碼:沒有堆棧跟蹤的NullPointerException

package redempt.divinity.ability.modifier.modifiers; 

import org.bukkit.Location; 
import org.bukkit.Material; 
import org.bukkit.entity.Entity; 
import org.bukkit.entity.Player; 
import org.bukkit.event.entity.EntityDamageByEntityEvent; 
import org.bukkit.util.Vector; 
import redempt.divinity.ability.AbilityType; 
import redempt.divinity.ability.modifier.ProjectileModifier; 

public class NoGravity extends ProjectileModifier { 
    Vector vector; 
    Location lastpos; 
    @Override 
    public void onUse(Player player, Entity projectile) { 
     vector = player.getLocation().getDirection().normalize(); 
     lastpos = projectile.getLocation(); 
    } 
    @Override 
    public String getName() { 
     return "No gravity"; 
    } 
    @Override 
    public Material getRepresentation() { 
     return Material.FEATHER; 
    } 
    @Override 
    public AbilityType getType() { 
     return AbilityType.PROJECTILE; 
    } 
    @Override 
    public void onHit(EntityDamageByEntityEvent event) { 
    } 
    @Override 
    public void onTick(Entity entity) { 
     try { 
      if (lastpos == null) { 
       lastpos = entity.getLocation(); 
      } 
      if (entity.getLocation().getBlock().getType().equals(Material.AIR)) { 
       entity.setVelocity(vector); 
      } 
      lastpos = entity.getLocation(); 
     } catch (Exception e) { 
      System.out.println("Exception"); 
      e.printStackTrace(); 
     } 
    } 
} 

onTick()被稱爲每剔,onUse()它開始調用onTick()之前被調用,這裏的控制檯輸出:

[11:26:52 INFO]: Exception 
[11:26:52 WARN]: java.lang.NullPointerException 
... this repeats often 

那麼,什麼是地獄這是否意味着,爲什麼它發生,我該如何解決?

+0

一旦有足夠的異常拋出相同的點,它會刪除堆棧跟蹤。你需要看看你的日誌的開始。 (或者你可以使用一個調試器來產生這個異常的斷點) –

+0

無論lastpos是否爲空,你仍然會這樣做'lastpos = entity.getLocation();' –

回答

2

可能與JVM的問題,爲了這個參數傳遞給它有完整的堆棧跟蹤:現在

-XX:-OmitStackTraceInFastThrow 

NPE是那裏,因爲出來的東西有null並嘗試從中調用一個方法。潛在的候選人是entity,因爲你致電entity.getLocation(),然後entity.getLocation(),因爲你打電話entity.getLocation().getBlock(),甚至打電話給你的對象,當你打電話entity.getLocation().getBlock().getType()不僅檢查他們不僅lastpos

+2

這似乎給了我棧回溯,謝謝 – ViperLordX