How do I trace this error..?


Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
        at java.util.ArrayList.add(ArrayList.java:370)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)
        at java.util.SubList.add(AbstractList.java:633)

I keep getting that error… how do I trace it?

The funny thing is, that ONLY with StackOverflowExceptions, the stack is reversed.

I’m pretty sure you’re adding a (sub)list in itself.

Any way to debug? :frowning:

As the stacktrace doesn’t reveal the source, you can start with scattering System.out.println(“something”); through your code, as if it’s a binary search for the locxation of the error.

I just did a search for sublist(…) in my project and found 2 results:


        msgz.clear();
        for (MessageEntry m : messages) {
            msgz.add(m);
        }
		int l = showMessages;
		if (messages.size() < l) {
			currentMessageScroll = 0;
			l = messages.size() - 1;
		}
		if (l >= messages.size()){
			l = messages.size() - 1;
		}
		if (currentMessageScroll + l > msgz.size()) {
			currentMessageScroll = msgz.size() - l;
		}
        if (msgz.size() > showMessages)
            msgz = msgz.subList(currentMessageScroll, 
					currentMessageScroll + l);
		Collections.reverse(msgz);
        g.setColor(new Color(25, 25, 25));

        
        showInfo.add(new ShowInfoEntry(message));
        if (showInfo.size() > 5) {
            int sz = showInfo.size();
            showInfo = showInfo.subList(sz - 5, sz);
        }

any idea? ???

What? That’s never happened to me.
It should say what caused the error at the bottom of the stacktrace.

but it doesn’t…

I posted like 1/100 of the stacktrace because it was longer than 1000 characters :expressionless:

Whoa, I just tried it, and riven’s right.

Not only is it backwards, it cuts off as well so it never lists the root cause.
Holy moly, that’s one useless stack trace. :smiley:

[edit:]
No, wait, it isn’t backwards. But it does cut off.

public class Test
{
    private void crash1() {
        crash2();
    }

    private void crash2() {
        crash3();
    }

    private void crash3() {
        crash1();
    }

    private void doCrash() {
        crash1();
    }

    public static void main(String[] args) {
        new Test().doCrash();
    }
}

Produces this:

C:\dev\Test>java -cp bin Test
Exception in thread "main" java.lang.StackOverflowError
        at Test.crash3(Test.java:18)
        at Test.crash2(Test.java:13)
        at Test.crash1(Test.java:8)
        at Test.crash3(Test.java:18)
        at Test.crash2(Test.java:13)
        at Test.crash1(Test.java:8)
        at Test.crash3(Test.java:18)
        at Test.crash2(Test.java:13)
        at Test.crash1(Test.java:8)
[...]
        at Test.crash1(Test.java:8)
        at Test.crash3(Test.java:18)
        at Test.crash2(Test.java:13)
        at Test.crash1(Test.java:8)
        at Test.crash3(Test.java:18)

C:\dev\Test>

I always (!!) get the source of the problem at the ‘top’ (visually) of the stacktrace, with a StrackOverflowException

That seems much more useful than what I’m getting (see my edit in the post above).

Now I’m confused… let me try to cook up an example, otherwise I’ve been fooling myself all along, but then… I don’t get StackOverflowExceptions that often.

I get them all the time. :wink:
Recursion is not my friend.

The VM i got the above result with:

java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03)
Java HotSpot(TM) Client VM (build 11.3-b02, mixed mode)

try this:

void killVM() {
List list = new ArrayList();
while (true) {list.add(new Object());}
}

It seems that the JVM cuts the stracktrace to 1024 elements.

Further, my assumption was wrong, and I won’t bore you with why I made this assumption, it was just that the top traces normally contained all the info I needed, and I expected it at the bottom.

Still I remember very clearly to have StackOverflowErrors with stacktraces with my main method at the TOP, but until I can reproduce, let’s assume my mind is playing tricks on me.

I’ve just went and profiled my application, should I post the results?

Hmm my code is here: http://pastebin.com/m54a9151c

I think that line 624-626 was causing it…

because it rapidly calls paint2D over and over when a ConcurrentModificationException occurrs, i’m still in the process of profiling it though XD

} catch (ConcurrentModificationException ex) {

Never ever catch a ConcurrentModificationException.

When these are thrown, it means there is a serious problem with your code. Fix that bug, don’t gracefully handle the errors it throws at you.

I fixed that ages ago, I made this class when I was n00b at coding o.o

I really don’t understand what you’re doing with the first one - I know what it looks like, but the reuse looks very messy. Anyway, both of those look like you’re eventually going to get sublists of sublists of sublists of …

Sublists are meant for getting a view on a full list you’re keeping. If you aren’t doing that then you’re better off simply deleting the elements you don’t want. If you can’t do that but still want to have sublists of sublists of etc. then maybe you should copy the sublists.

Basically you’re not giving enough context for me to be confident in recommending a solution, but the code snippets you have posted look very fishy.

Indeed. Looks you just want to show the most recent entries.

Use a LinkedList for that, calling addLast() and removeFirst()