Java程序在崩溃前无限打印 [英] Java Program printing infinitely before crashing

查看:29
本文介绍了Java程序在崩溃前无限打印的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我运行 javac Hero.java 然后 java Hero 程序吐出大量如下所示的行:

When I run javac Hero.java Then java Hero The program spits out tons of lines that look like this:

Hero@322ba3e4
Hero@4f14e777
Hero@65685e30
Hero@26ffd553
Hero@660e5025
Hero@35afe17b

这是什么?Hero@322ba3e4

然后显示,

Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.cs.UTF_8.updatePositions(UTF_8.java:77)
    at sun.nio.cs.UTF_8$Encoder.encodeArrayLoop(UTF_8.java:564)
    at sun.nio.cs.UTF_8$Encoder.encodeLoop(UTF_8.java:619)
    at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:561)
    at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:271)
    at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:125)
    at java.io.OutputStreamWriter.write(OutputStreamWriter.java:207)
    at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:129)
    at java.io.PrintStream.write(PrintStream.java:526)
    at java.io.PrintStream.print(PrintStream.java:669)
    at java.io.PrintStream.println(PrintStream.java:823)
    at Hero.DrowRanger(Hero.java:78)
    at Hero.DrowRanger(Hero.java:79)

这一行重复了 100 次:

This line repeats 100s of times:

at Hero.DrowRanger(Hero.java:79)

这是该行的方法,

            private static Object DrowRanger() {
            Hero DrowRanger = new Hero(
                  0,
                  "Agility",
                  "Ranged",
                  "Frost Arrows",
                  "Gust",
                  "Precision Aura",
                  "Marksmanship",
                  17,
                  1.9,
                  26,
                  1.9,
                  15,
                  1.4,
                  473,
                  195,
                  44,
                  55,
                  625,
                  0.64,
                  300);

       System.out.println(DrowRanger);
 return DrowRanger();                // Line 79 Is Here      
}

这是完整的课程

public class Hero implements NPC {

        private int level;
        private String primaryAttribute;
        private String attackType;
        private String ability1;
        private String ability2;
        private String ability3;
        private String ability4;
        private double strength;
        private double strengthMultiplier;
        private double agility;
        private double agilityMultiplier;
        private double intelligence;
        private double intelligenceMultiplier;
        private int health;
        private int mana;
        private int damageMin;
        private int damageMax;
        private int range;
        private double armor;
        private int movement;

        //default constructor
        public Hero(
                int level,
                String primaryAttribute,
                String attackType,
                String ability1,
                String ability2,
                String ability3,
                String ability4,
                double strength,
                double strengthMultiplier,
                double agility,
                double agilityMultiplier,
                double intelligence,
                double intelligenceMultiplier,
                int health,
                int mana,
                int damageMin,
                int damageMax,
                int range,
                double armor,
                int movement
                    ) {

        } // End Constructor

        public static void main (String[] args) {
            DrowRanger();

            }

        private static Object DrowRanger() {
        Hero DrowRanger = new Hero(
              0,
              "Agility",
              "Ranged",
              "Frost Arrows",
              "Gust",
              "Precision Aura",
              "Marksmanship",
              17,
              1.9,
              26,
              1.9,
              15,
              1.4,
              473,
              195,
              44,
              55,
              625,
              0.64,
              300);

        System.out.println(DrowRanger);
        return DrowRanger();
}


        // getters and setters - required to implement ALL from interface
        public int getLevel() {
            return this.level;
        }

        public String getPrimaryAttribute() {
            return this.primaryAttribute;
        }

        public String getAttackType() {
            return this.attackType;
        }

        public String getAbility1() {
            return this.ability1;
        }

        public String getAbility2() {
            return this.ability2;
        }

        public String getAbility3() {
            return this.ability3;
        }

        public String getAbility4() {
            return this.ability4;
        }

        public double getStrength() {
            return this.strength;
        }

        public double getStrengthMultiplier() {
            return this.strengthMultiplier;
        }

        public double getAgility() {
            return this.agility;
        }

        public double getAgilityMultiplier() {
            return this.agilityMultiplier;
        }

        public double getIntelligence() {
            return this.intelligence;
        }

        public double getIntelligenceMultiplier() {
            return this.intelligenceMultiplier;
        }

        public int getHealth() {
            return this.health;
        }

        public int getMana() {
            return this.mana;
        }

        public int getDamageMin() {
            return this.damageMin;
        }

        public int getDamageMax() {
            return this.damageMax;
        }

        public int getRange() {
            return this.range;
        }

        public double getArmor() {
            return this.armor;
        }

        public int getMovement() {
            return this.movement;
        }

    // This is where the setters are.

        public void setLevel(int level) {
            this.level = level;
        }

        public void setPrimaryAttribute(String primaryAttribute) {
            this.primaryAttribute = primaryAttribute;
        }

        public void setAttackType(String attackType) {
            this.attackType = attackType;
        }

        public void setAbility1(String ability1) {
            this.ability1 = ability1;
        }

        public void setAbility2(String ability2) {
            this.ability2 = ability2;
        }

        public void setAbility3String(String ability3) {
            this.ability3 = ability3;
        }

        public void setAbility4(String ability4) {
            this.ability4 = ability4;
        }

        public void setStrength(double strength) {
            this.strength = strength;
        }

        public void setStrengthMultiplier(double strengthMultiplier) {
            this.strengthMultiplier = strengthMultiplier;
        }

        public void setAgility(double agility) {
            this.agility = agility;
        }

        public void setAgilityMultiplier(double agilityMultiplier) {
            this.agilityMultiplier = agilityMultiplier;
        }

        public void setIntelligence(double intelligence) {
            this.intelligence = intelligence;
        }

        public void setIntelligenceMultiplier(double intelligenceMultiplier) {
            this.intelligenceMultiplier = intelligenceMultiplier;
        }

        public void setHealth(int health) {
            this.health = health;
        }

        public void setMana(int mana) {
            this.mana = mana;
        }

        public void setDamageMin(int damageMin) {
            this.damageMin = damageMin;
        }

        public void setDamageMax(int damageMax) {
            this.damageMax = damageMax;
        }

        public void setRange(int range) {
            this.range = range;
        }

        public void setArmor(double armor) {
            this.armor = armor;
        }

        public void setMovement(int movement) {
            this.movement = movement;
        }

    } // End Character Class
`

推荐答案

您的 DrowRanger 方法无限地调用自身.这几乎总是导致 StackOverflowException 的原因.

Your DrowRanger method is calling itself infinitely. This is almost always the cause of a StackOverflowException.

这一行:

return DrowRanger(); 

调用 DrowRanger 方法,但由于您在 DrowRanger 方法内部,它只会无限地调用自身.我认为您打算返回本地对象:

Calls the DrowRanger method, but since you're inside the DrowRanger method it just keeps calling itself infinitely. I think you meant to return the local object:

return DrowRanger;

一般来说,给方法和对象赋予相同的名称是一个坏主意.此外,Java 约定始终以小写字母开头方法和变量/字段名称.

In general, it is a bad idea to give methods and objects the same name. Also, it is java convention always start method and variable/field names with a lowercase letter.

您看到的输出是 java 如何打印没有覆盖 toString() 方法的对象.请参阅这篇文章,了解toString() 方法有效.

The output you're seeing is how java prints objects that have not overridden the toString() method. See this post for an explanation of how the toString() method works.

这篇关于Java程序在崩溃前无限打印的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆