diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java b/core-java/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java new file mode 100644 index 0000000000..9555433792 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java @@ -0,0 +1,8 @@ +package com.baeldung.stackoverflowerror; + +public class AccountHolder { + private String firstName; + private String lastName; + + AccountHolder jointAccountHolder = new AccountHolder(); +} diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java b/core-java/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java new file mode 100644 index 0000000000..99ef2b4f92 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java @@ -0,0 +1,16 @@ +package com.baeldung.stackoverflowerror; + +public class ClassOne { + private int oneValue; + private ClassTwo clsTwoInstance = null; + + public ClassOne() { + oneValue = 0; + clsTwoInstance = new ClassTwo(); + } + + public ClassOne(int oneValue, ClassTwo clsTwoInstance) { + this.oneValue = oneValue; + this.clsTwoInstance = clsTwoInstance; + } +} diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java b/core-java/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java new file mode 100644 index 0000000000..0d34ac3c32 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java @@ -0,0 +1,16 @@ +package com.baeldung.stackoverflowerror; + +public class ClassTwo { + private int twoValue; + private ClassOne clsOneInstance = null; + + public ClassTwo() { + twoValue = 10; + clsOneInstance = new ClassOne(); + } + + public ClassTwo(int twoValue, ClassOne clsOneInstance) { + this.twoValue = twoValue; + this.clsOneInstance = clsOneInstance; + } +} diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java b/core-java/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java new file mode 100644 index 0000000000..9fb00d4b83 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java @@ -0,0 +1,7 @@ +package com.baeldung.stackoverflowerror; + +public class InfiniteRecursionWithTerminationCondition { + public int calculateFactorial(final int number) { + return number == 1 ? 1 : number * calculateFactorial(number - 1); + } +} diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java b/core-java/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java new file mode 100644 index 0000000000..0c0c392532 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java @@ -0,0 +1,7 @@ +package com.baeldung.stackoverflowerror; + +public class RecursionWithCorrectTerminationCondition { + public static int calculateFactorial(final int number) { + return number <= 1 ? 1 : number * calculateFactorial(number - 1); + } +} diff --git a/core-java/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java b/core-java/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java new file mode 100644 index 0000000000..f5160c3eb3 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java @@ -0,0 +1,7 @@ +package com.baeldung.stackoverflowerror; + +public class UnintendedInfiniteRecursion { + public int calculateFactorial(int number) { + return number * calculateFactorial(number - 1); + } +} diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/AccountHolderUnitTest.java b/core-java/src/test/java/com/baeldung/stackoverflowerror/AccountHolderUnitTest.java new file mode 100644 index 0000000000..40530ddba5 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/stackoverflowerror/AccountHolderUnitTest.java @@ -0,0 +1,10 @@ +package com.baeldung.stackoverflowerror; + +import org.junit.Test; + +public class AccountHolderUnitTest { + @Test(expected = StackOverflowError.class) + public void whenInstanciatingAccountHolder_thenThrowsException() { + AccountHolder holder = new AccountHolder(); + } +} diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyUnitTest.java b/core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyUnitTest.java new file mode 100644 index 0000000000..480edcf49d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.stackoverflowerror; + +import static org.junit.Assert.fail; + +import org.junit.Test; + +public class CyclicDependancyUnitTest { + @Test + public void whenInstanciatingClassOne_thenThrowsException() { + try { + ClassOne obj = new ClassOne(); + fail(); + } catch (StackOverflowError soe) { + soe.printStackTrace(); + } + } +} diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionUnitTest.java b/core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionUnitTest.java new file mode 100644 index 0000000000..c3a210f54f --- /dev/null +++ b/core-java/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.stackoverflowerror; + +import static junit.framework.TestCase.assertEquals; +import static org.junit.Assert.fail; + +import org.junit.Test; + +public class InfiniteRecursionWithTerminationConditionUnitTest { + @Test + public void givenPositiveIntNoOne_whenCalcFact_thenThrowsException() { + int numToCalcFactorial = 1; + InfiniteRecursionWithTerminationCondition irtc = new InfiniteRecursionWithTerminationCondition(); + + assertEquals(1, irtc.calculateFactorial(numToCalcFactorial)); + } + + @Test + public void givenPositiveIntGtOne_whenCalcFact_thenThrowsException() { + int numToCalcFactorial = 5; + InfiniteRecursionWithTerminationCondition irtc = new InfiniteRecursionWithTerminationCondition(); + + assertEquals(120, irtc.calculateFactorial(numToCalcFactorial)); + } + + @Test + public void givenNegativeInt_whenCalcFact_thenThrowsException() { + try { + int numToCalcFactorial = -1; + InfiniteRecursionWithTerminationCondition irtc = new InfiniteRecursionWithTerminationCondition(); + + irtc.calculateFactorial(numToCalcFactorial); + fail(); + } catch (StackOverflowError soe) { + soe.printStackTrace(); + } + } +} diff --git a/core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionUnitTest.java b/core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionUnitTest.java new file mode 100644 index 0000000000..a712366ee7 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.stackoverflowerror; + +import org.junit.Test; + +public class UnintendedInfiniteRecursionUnitTest { + @Test(expected = StackOverflowError.class) + public void givenPositiveIntNoOne_whenCalFact_thenThrowsException() { + int numToCalcFactorial = 1; + UnintendedInfiniteRecursion uir = new UnintendedInfiniteRecursion(); + + uir.calculateFactorial(numToCalcFactorial); + } + + @Test(expected = StackOverflowError.class) + public void givenPositiveIntGtOne_whenCalcFact_thenThrowsException() { + int numToCalcFactorial = 2; + UnintendedInfiniteRecursion uir = new UnintendedInfiniteRecursion(); + + uir.calculateFactorial(numToCalcFactorial); + } + + @Test(expected = StackOverflowError.class) + public void givenNegativeInt_whenCalcFact_thenThrowsException() { + int numToCalcFactorial = -1; + UnintendedInfiniteRecursion uir = new UnintendedInfiniteRecursion(); + + uir.calculateFactorial(numToCalcFactorial); + } +}