Co-Authored-By: Claude Sonnet 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01KqJyCidz3ZgRyHABv2GVJh
41 lines
1.8 KiB
Markdown
41 lines
1.8 KiB
Markdown
# exceptions
|
|
|
|
Companion code for the ankurm.com post *"Java Exception Handling Deep Dive: Checked vs Unchecked,
|
|
Suppression, and What Exceptions Actually Cost."* Module `exceptions` in `java-core-examples`.
|
|
|
|
All explanation lives in the post; this module holds the runnable evidence and the captured output.
|
|
|
|
## Versions
|
|
|
|
| Component | Version |
|
|
|---|---|
|
|
| JDK | 25.0.4.1+1 (Temurin, LTS) |
|
|
| JMH | 1.37 |
|
|
| JUnit Jupiter | 5.11.0 |
|
|
| Hardware | 2 vCPU x86-64 VM (timings are indicative, not a leaderboard) |
|
|
|
|
## Quickstart
|
|
|
|
```bash
|
|
export JDK25_HOME=/path/to/jdk-25
|
|
./scripts/run-all.sh # rebuilds and regenerates everything in output/
|
|
```
|
|
|
|
## What is in here
|
|
|
|
| File | Shows | Output |
|
|
|---|---|---|
|
|
| `SuppressedDemo` | try/finally loses the original exception; try-with-resources suppresses the close() failure instead | `01` |
|
|
| `ChainingDemo` | `Caused by` / `... N more`, and wrapping without the cause | `02` |
|
|
| `CheckedVsUncheckedDemo` | which types are checked; `UncheckedIOException` in a lambda | `03` |
|
|
| `CustomHierarchyDemo` | an unchecked base type with an error code; the 4-argument `Throwable` constructor | `04` |
|
|
| `FinallyTrapDemo` | `return` inside `finally` discards the exception | `05` |
|
|
| `src/broken/*.java` | four sources that deliberately fail to compile; javac's real message is captured | `06`-`09` |
|
|
| `OmitStackTraceDemo` | HotSpot replaces a hot implicit exception with one that has no stack trace | `10` |
|
|
| `ExceptionCostBenchmark` | JMH: normal vs no-stack-trace vs preallocated vs return code, at three stack depths | `11` |
|
|
| `DeepTraceDemo` | stack traces are capped at `MaxJavaStackTraceDepth` = 1024 frames | `12`, `14` |
|
|
| `ExceptionBehaviourTest` | 8 assertions behind the claims above | `13` |
|
|
|
|
The JMH run is one fork, 3 warmup and 5 measurement iterations of 1 s; re-running moves the
|
|
numbers by tens of percent but not the ordering.
|