Java 简单程序中的堆栈溢出错误
亲爱的,我想实现这个行为: “闯入者将被枪杀,幸存者将再次被枪杀” 但我得到了这个线索:Java 简单程序中的堆栈溢出错误,java,Java,亲爱的,我想实现这个行为: “闯入者将被枪杀,幸存者将再次被枪杀” 但我得到了这个线索: 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.Shoot
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);
}
}
我做错了什么
我使用eclipse,问题出现在Java6、7和8中
返回!name.equals(“Chuck Norris”)如果此人的名字是“Chuck Norris”,则代码>始终返回false,因此您可以无限循环
<>你可能有有限的弹药,所以你应该考虑弹药的一些功能。 < P> <代码>返回!name.equals(“Chuck Norris”)如果此人的名字是“Chuck Norris”,则代码>始终返回false,因此您可以无限循环
<>你可能有有限的弹药,所以你应该考虑弹药的一些功能。 在下面的片段中,你在代码<循环> <代码>的同时,这个人还活着。由于Chuck Norris不会死,你最终会无限地向他射击,他最终会用一个
堆栈溢出错误杀死你的程序
:
public void shoot(Person person) {
if(!person.isDead()){
shoot(person);
}
}
您可以设置最大弹药数量,或添加一个firstShot
参数,使其仅允许2发子弹。例如:
public void shoot(Person person) {
shoot(person, true);
}
private void shoot(Person person, boolean firstShot) {
if(firstShot && !person.isDead()) {
shoot(person, false);
}
}
在下面的代码片段中,您将在此人活着时循环执行
shot
。由于Chuck Norris不会死,你最终会无限地向他射击,他最终会用一个堆栈溢出错误杀死你的程序
:
public void shoot(Person person) {
if(!person.isDead()){
shoot(person);
}
}
您可以设置最大弹药数量,或添加一个firstShot
参数,使其仅允许2发子弹。例如:
public void shoot(Person person) {
shoot(person, true);
}
private void shoot(Person person, boolean firstShot) {
if(firstShot && !person.isDead()) {
shoot(person, false);
}
}
你的错误在于你自己。添加该条款
if(name.equals("Chuck Norris")){
throw new ChuckNorrisException("Chuck Norris saw through your ploy to consider him a person");
}
然后你就会好起来。你的错误就在你自己身上。添加该条款
if(name.equals("Chuck Norris")){
throw new ChuckNorrisException("Chuck Norris saw through your ploy to consider him a person");
}
然后你就没事了。s/Chuck Norris/Jon Skeet/这是在调试器中单步执行代码可以帮助你了解它为什么会永远递归的地方。s/Chuck Norris/Jon Skeet/这是在调试器中单步执行代码可以帮助你了解它为什么会永远递归的地方。但他不会生气?如果你只向他开枪两次,我想他可能根本没有注意到。所以你应该是安全的。但是他不会生气吗?如果你只向他开枪两次,我想他可能根本不会注意到。所以你应该是安全的。这个人是不朽的。即使你有无限的弹药,你也会用一生去射击他,一代一代。这个人是不朽的。即使你有无限的弹药,你也会用一生的时间一代一代地射击他。我总是被告知不要扔一个ChuckNorrisException,否则ChuckNorrisException会扔我…我总是被告知不要扔一个ChuckNorrisException,否则ChuckNorrisException会扔我。。。