2016-04-30 1 views
0

Javaは、何らかの理由で、私にNullPointerExceptionを与えています。私はこれが通常簡単に修正できることを知っていますが、このケースでは、なぜそれが最初にそれを投げているのか理解できません。なぜ私はそれを理解できないのですか?まあ、それはスタックトレースがないので!それはonTick()を呼び出しを開始する前にスタックトレースなしの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()が呼ばれ、ここでコンソール出力です:ここに私のコードです

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

だから、地獄は、この平均値を何、なぜそれをしませんどうしたらいいのですか?

+0

同じポイントで十分な例外がスローされると、スタックトレースが破棄されます。あなたはあなたのログの始まりを見る必要があります。 (または、この例外が発生するブレークポイントにデバッガを使用することができます) –

+0

lastposがnullの場合でも、あなたはまだ 'lastpos = entity.getLocation();' –

答えて

2

はおそらく完全なスタックトレースを持つように、JVMで発行するためには、それにこの引数を渡す:そこnullであり、あなたはそれからメソッドを呼び出そうと何か出ているので

-XX:-OmitStackTraceInFastThrow 

さて、NPEがあります。 entity.getLocation()entity.getLocation()entity.getLocation().getBlock()、またはentity.getLocation().getBlock().getType()を呼び出すときに取得するオブジェクトを呼び出すので、潜在的な候補はentityです。lastposもチェックしてください。

+2

を実行します。 – ViperLordX

関連する問題