2016-04-30 90 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