相关疑难解决方法(0)

为什么这个toString()方法导致StackOverFlowError?

我已经从这个这个 答案中理解了你的代码可能进入无限循环导致stackOverFlowError的可能情况,但我不明白如何在这里复制相同的场景,

public class A {
  private B b = new B();
  @Override
  public String toString() {
      return "b "+b;
  }
}

public class B {
  private A a = new A();
  @Override
  public String toString() {
      return "";
  }
}

public class StackoverflowErrorTest {
  public static void main(String[] args) {
     A a = new A();
     System.out.println(a);
  }
}
Run Code Online (Sandbox Code Playgroud)

此代码生成下面的堆栈跟踪: -

Exception in thread "main" java.lang.StackOverflowError
at stackoverflowerror.B.<init>(B.java:5)
at stackoverflowerror.A.<init>(A.java:5)
.
.
.
Run Code Online (Sandbox Code Playgroud)

根据我的理解,当我在main方法中打印对象'a'时,它将调用A类的toString方法,在该方法中,我将返回B类的对象,该对象将隐式调用B类的toString方法.现在,在B类的toString方法中,我返回的是一个空字符串.那么无限循环的范围如何以及在何处进入图片.请解释.

java stack-overflow

8
推荐指数
2
解决办法
821
查看次数

循环依赖与DRY

我正在设计一个可重用的类库,其中包含2个名为core.xml.dll和core.string.dll的程序集(以及其他程序集).

xml程序集引用字符串程序集以使用某些字符串帮助程序方法.

但是现在有一个字符串方法可以从使用xml程序集中包含的方法中受益.

如果我从字符串程序集引用xml程序集,我将创建一个循环依赖项,并且无法从源代码构建两个程序集.(即鸡肉和鸡蛋问题).

为了遵循"不要重复自己"的原则,我希望避免重复两个程序集中的功能.如果我在实现中发现错误,我只想在一个地方修复它.

虽然我可以将组件合并为一个,但这并不理想,因为它会降低组件的内聚性.

我需要重新构建和重新部署整个程序集,只是为了对特定类进行小的更改.而且,最终,有这么多的依赖关系,我可能会最终得到一个巨大的库程序集.

因此,在可重用的库集合集的上下文中,这里使用的最佳方法是什么?另外,.NET框架本身如何处理这个问题?

(在Reflector中,似乎System.Configuration.dll引用System.XML.DLL,反之亦然.这实际上是否正确,如果是这样,如何管理循环依赖?)

.net dry circular-dependency

6
推荐指数
1
解决办法
1476
查看次数

OO:容器是否包含自行车或椅子?

容器可以包含属于人的自行车和椅子.我想检查,如果容器包含自行车或所述人的椅子.没有使用这可能instanceof吗?

public class Container {

    public Map<Person, List<Item>> items = new HashMap<>();

    public void add(Person p, Item item) {
        items.get(p).add(item);
    }

    public boolean containsChair(Person owner) {
        for(Item i : items.get(owner)) {
            if(i instanceof Chair) {
                return true;
            }
        }
        return false;
    }

    public boolean containsBike(Person owner) {
        for(Item i : items.get(owner)) {
            if(i instanceof Bike) {
                return true;
            }
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

出于说明的目的,Item,Bike,Chair,Person都是最简单的类存根:

public class Person { public String name; }
public abstract class Item {} …
Run Code Online (Sandbox Code Playgroud)

java oop

5
推荐指数
2
解决办法
125
查看次数

java本地和实例对象创建时的StackOverflowError

嗨任何人可以请解释我为什么是这样的代码片段给我的StackOverflowError我很感激,如果你能解释发生了什么事时,instanceObj初始化和调用构造函数ObjectTest和java.lang.Object继承构造函数.在我看来ObjectTest构造函数循环一遍又一遍.但我不知道确切的原因?所以任何建议......


public class ObjectTest {

  public ObjectTest() {

   }


  ObjectTest instanceObj = new ObjectTest();


  public static void main(String[] args) {

     ObjectTest localObj = new ObjectTest();
   }
}
Run Code Online (Sandbox Code Playgroud)

java stack-overflow local object instance

0
推荐指数
1
解决办法
1669
查看次数

在 Java 中传递参数而不会出现 stackoverflow 错误

目前我正在努力解决一个小问题,我猜。执行我的主要方法时,我收到一个计算器溢出错误。这是因为 Artist 类在 Language 类中创建了一个实例来访问来自 Artist 类(方法)的一些参数。您对我如何根据当前设置设置构造有任何建议吗?

有五个类相互交互:

第一类是带有主要方法的概览类。她应该创建我的控件类的一个实例并执行方法 control.displayArtist(salary, name):

public class Overview {
    private static Control control;
    private static String name;
    private static int salary;
    

public static void main (String[]args) {
        control = new Control();
        control.displayArtist(salary, name);
        
    }
}

Run Code Online (Sandbox Code Playgroud)

第二个类是 Control 类。类 Control 创建类 Language 的实例,并由方法 displayArtist(int salary, String name) 组成。这个方法是在Overview类的main方法中直接调用的:

public class Control {

    private Language language;


public Control() {
    language = new Language();
    
}

public void displayArtist(int salary, String name) {
    language.displayArtistAndSalary(name, salary);
}

}

Run Code Online (Sandbox Code Playgroud)

Language …

java

-1
推荐指数
1
解决办法
69
查看次数

标签 统计

java ×4

stack-overflow ×2

.net ×1

circular-dependency ×1

dry ×1

instance ×1

local ×1

object ×1

oop ×1