2016-04-22 13 views
0

ディアーズ、私はこの動作を実装する:簡単なプログラムではStackOverflowError

「侵入者は、撃たれる生存者が再び撃たれる」

をしかし、私はこのスタックトレースを取得する:

Exception in thread "main" java.lang.StackOverflowError 
    at java.lang.String.equals(String.java:975) 
    at test.Person.isDead(Person.java:14) 
    at test.Shooter.shoot(Shooter.java:7) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 
    at test.Shooter.shoot(Shooter.java:8) 

'プロパティ' クラス:

package test; 

public class Property { 

    private Shooter shooter = new Shooter(); 

    public void punish(Person tresspasser) { 

     shooter.shoot(tresspasser); 
    } 
} 

シュータークラス:

package test; 

public class Shooter { 

    public void shoot(Person person) { 

     if(!person.isDead()){ 
      shoot(person); 
     } 
    } 
} 

「人のクラス:

package test; 

public class Person { 

    private String name; 

    public Person(String name) { 

     this.name = name; 
    } 

    public void tresspass(Property property) { 

     property.punish(this); 
    } 

    public boolean isDead(){ 

     return !name.equals("Chuck Norris"); 
    } 
} 

そして最後に、メインクラス:私は間違って何をやっている

package test; 

public class Main { 

    public static void main(String args[]) { 

     Person person = new Person("Chuck Norris"); 

     Property myProperty = new Property(); 

     person.tresspass(myProperty); 
    } 
} 

?人の名前が「チャック・ノリス」であるため、あなたループ無限にあれば

私は日食使用して、問題は、Java 6、図7、図8で発生...

S.は

+1

s/Chuck Norris/Jon Skeet/ – Mureinik

+0

これは、デバッガでコードをステップ実行することで、なぜそれが永久に再発するのかを理解するのに役立ちます。 –

答えて

3

あなたの間違いはあなたのPersonコンストラクタにあります。

if(name.equals("Chuck Norris")){ 
    throw new ChuckNorrisException("Chuck Norris saw through your ploy to consider him a person"); 
} 

を追加してください。

+3

私はいつもChuckNorrisExceptionをスローしないように言われました。さもなければChuckNorrisExceptionが私を投げるでしょう... – Bamboomy

10

return !name.equals("Chuck Norris");常にfalseを返します。

弾薬が限られている可能性がありますので、弾薬機能を考慮する必要があります。

+4

この人は不滅です。あなたは無制限の弾薬を持っていても、あなたは一世代に渡って彼を撃って、一生を過ごすでしょう。 –

+0

http://codesqueeze.com/the-ultimate-top-25-chuck-norris-the-programmer-jokes/ – SDsolar

3

次のスニペットでは、生きている間にshootにループします。チャック・ノリスが死ぬことができないので、あなたは彼の上に無限に撮影し終わると、彼はStackOverflowErrorを使用してプログラムを殺し終わる:

public void shoot(Person person) { 

    if(!person.isDead()){ 
     shoot(person); 
    } 
} 

あなたは弾薬の最大数を設定したり、のみ2ショットを可能にしfirstShot引数を追加することができます。例:

public void shoot(Person person) { 
    shoot(person, true); 
} 

private void shoot(Person person, boolean firstShot) { 
    if(firstShot && !person.isDead()) { 
     shoot(person, false); 
    } 
} 
+0

しかし、彼は怒っていないでしょうか? – Bamboomy

+2

あなたが彼を2回だけ撃った場合、彼はそれを気付かないかもしれないと思う。だからあなたは安全でなければなりません。 –

関連する問題