diff --git a/java-exception-stacktraces/README.MD b/java-exception-stacktraces/README.MD
new file mode 100644
index 0000000..e69de29
diff --git a/java-exception-stacktraces/pom.xml b/java-exception-stacktraces/pom.xml
new file mode 100644
index 0000000..478d660
--- /dev/null
+++ b/java-exception-stacktraces/pom.xml
@@ -0,0 +1,48 @@
+
+ 4.0.0
+
+ com.pivovarit
+ 1.0
+ java-exception-stacktraces
+
+ java-exception-stacktraces
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 21
+
+
+
+ maven-surefire-plugin
+ 2.19.1
+
+
+ org.junit.platform
+ junit-platform-surefire-provider
+ 1.1.0
+
+
+
+
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ 5.10.2
+ test
+
+
+ org.assertj
+ assertj-core
+ 3.22.0
+ test
+
+
+
diff --git a/java-exception-stacktraces/src/main/java/com/pivovarit/exception/ExceptionCacheExample.java b/java-exception-stacktraces/src/main/java/com/pivovarit/exception/ExceptionCacheExample.java
new file mode 100644
index 0000000..de46466
--- /dev/null
+++ b/java-exception-stacktraces/src/main/java/com/pivovarit/exception/ExceptionCacheExample.java
@@ -0,0 +1,23 @@
+package com.pivovarit.exception;
+
+import java.util.Collections;
+import java.util.IdentityHashMap;
+
+class ExceptionCacheExample {
+
+ public static void main(String[] args) {
+ var exceptions = Collections.newSetFromMap(new IdentityHashMap<>());
+
+ String foo = null;
+ for (int i = 0; i < Integer.MAX_VALUE; i++) {
+ try {
+ foo.toUpperCase();
+ } catch (NullPointerException e) {
+ exceptions.add(e);
+ }
+ }
+ 99327
+
+ System.out.println(exceptions.size());
+ }
+}
diff --git a/java-exception-stacktraces/src/main/java/com/pivovarit/exception/StacktraceDropExample.java b/java-exception-stacktraces/src/main/java/com/pivovarit/exception/StacktraceDropExample.java
new file mode 100644
index 0000000..9de102d
--- /dev/null
+++ b/java-exception-stacktraces/src/main/java/com/pivovarit/exception/StacktraceDropExample.java
@@ -0,0 +1,28 @@
+package com.pivovarit.exception;
+
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicReference;
+
+class StacktraceDropExample {
+
+ public static void main(String[] args) {
+ var previous = new AtomicReference();
+
+ String foo = null;
+ for (int i = 0; i < Integer.MAX_VALUE; i++) {
+ try {
+ foo.toUpperCase();
+ } catch (NullPointerException e) {
+ if (e.getStackTrace().length == 0) {
+ System.out.printf("Stacktrace dropped at iteration %d%n", i);
+ System.out.printf("Last stacktrace: %s%n",
+ Arrays.toString(previous.get().getStackTrace()));
+ System.out.printf("New stacktrace: %s%n",
+ Arrays.toString(e.getStackTrace()));
+ return;
+ }
+ previous.set(e);
+ }
+ }
+ }
+}
diff --git a/java-exception-stacktraces/src/main/java/com/pivovarit/exception/StaticStacklessExceptionExample.java b/java-exception-stacktraces/src/main/java/com/pivovarit/exception/StaticStacklessExceptionExample.java
new file mode 100644
index 0000000..3c75ad1
--- /dev/null
+++ b/java-exception-stacktraces/src/main/java/com/pivovarit/exception/StaticStacklessExceptionExample.java
@@ -0,0 +1,14 @@
+package com.pivovarit.exception;
+
+class StaticStacklessExceptionExample {
+
+ private static final NullPointerException NULL_POINTER_EXCEPTION = new NullPointerException();
+
+ static {
+ NULL_POINTER_EXCEPTION.setStackTrace(new StackTraceElement[0]);
+ }
+
+ public static void main(String[] args) {
+ throw NULL_POINTER_EXCEPTION;
+ }
+}
diff --git a/pom.xml b/pom.xml
index da6f3ab..6a1d53d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,6 +14,7 @@
kotlin-collections
hamming-error-correction
kotlin-type-inference
+ java-exception-stacktraces
java-sneaky-throws-lambda
java-priorityqueue-stream-order
java-stream-mapmulti