Skip to content
GetUp Library

Java Deep-Dives

Chess engine internals, search algorithms, and JVM exception debugging — written from code that actually runs.

A developer comparing the class file version stamped into a compiled Java class against the highest version the runtime JVM will accept
Aug 16, 2026 Engineering

UnsupportedClassVersionError: Fixing Java Version Mismatches

Same LinkageError family, opposite problem — the class is right there and the JVM refuses to read it. What 61.0 and 65.0 actually mean, the three build topologies that open the gap, and why bumping -target is not a fix.

Read Article
A developer reading a Java heap dump, tracing a large retained size back to the single object holding it
Aug 11, 2026 Engineering

OutOfMemoryError: Java Heap Space — Diagnosing With Heap Dumps

The line in the stack trace is a bystander — whoever allocated last pays for everyone else. Which OOME message you got, three real causes, how to read a dump with dominator trees and retained size, and why -Xmx belongs last.

Read Article
A developer reading a long truncated Java stack trace, looking for the small group of frames that repeats all the way down
Aug 6, 2026 Engineering

StackOverflowError: Recursion Depth, JVM Stack Size, and How to Debug It

The repeating group of frames is the diagnosis, not the length of the trace. What a thread stack actually holds, why "how deep can I recurse" has no fixed answer, three real causes, and why raising -Xss belongs last.

Read Article
A developer tracing a missing class through the classpath, comparing the jar that was built against the jar that was deployed
Aug 1, 2026 Engineering

ClassNotFoundException vs NoClassDefFoundError: The Difference Actually Matters

One is a checked exception you asked for, the other is an Error the JVM hands you — and "Could not initialize class" does not mean the class is missing at all. The three loading phases, three real causes, and the fixes with their costs.

Read Article
A Java developer debugging a for-loop that modifies an ArrayList while an iterator over it is still live
Jul 27, 2026 Engineering

ConcurrentModificationException: Why Your For-Loop Breaks and Four Ways to Fix It

It has nothing to do with threads, and removing the second-to-last element does not throw at all — it silently skips the last one. The modCount machinery, three real causes, and four fixes with their actual costs.

Read Article
A developer reading a helpful NullPointerException message in Java 21 back to the chained call that threw it
Jul 22, 2026 Engineering

NullPointerException in Java 21: Reading the Helpful Message

JEP 358 turned the emptiest stack trace in Java into a sentence. The grammar of that sentence, three production causes with the exact message each one throws, and the places it still leaves you stranded.

Read Article
A developer deploying a Java chess engine as a Lichess bot over the streaming HTTP API
Jul 17, 2026 Engineering

Deploying a Lichess Bot: BOT Account, API Streaming, and What Broke

The engine played fine offline, then sat still in its first live game while the clock ran out. The irreversible BOT upgrade, two NDJSON streams, a systemd unit, and eight failures that only appear against real opponents.

Read Article
A developer implementing the UCI protocol for a Java chess engine over stdin and stdout
Jul 12, 2026 Engineering

Implementing the UCI Protocol in Plain Java (No Frameworks)

Move generation, search and evaluation all worked, and Arena still showed the engine as not responding. The handshake, the position and go parsers, the worker thread that keeps stop readable, and the missing flush that lost a game on time.

Read Article
A developer writing piece-square tables and a tapered evaluation function for a Java chess engine
Jul 7, 2026 Engineering

Writing a Chess Evaluation Function: Material, Piece-Square Tables, Mobility

A correct search that only counts material shuffles rooks, refuses to castle and parks knights on the rim. Piece values, 64 numbers per piece type, a midgame-to-endgame taper, a mobility term, and the symmetry test that caught three bugs in one assertion.

Read Article
A developer comparing measured minimax and alpha-beta node counts in a Java chess engine
Jul 2, 2026 Engineering

Minimax to Alpha-Beta: Measuring the Actual Node Reduction

A correct move generator still plays random chess. So I wrote minimax, added alpha-beta, and counted every node instead of trusting the textbook square root. Move ordering turned out to do almost nothing from the start position and almost everything in a real midgame.

Read Article
A developer implementing en passant, castling rights and the halfmove clock in a Java chess engine
Jun 27, 2026 Engineering

Handling En Passant, Castling Rights, and the 50-Move Rule Correctly

Three rules every tutorial hand-waves. They are not hard to understand, they are hard to get right, because none of them live on the board. A stale en passant square, rights that outlived a captured rook, and a clock counting the wrong thing.

Read Article
A developer debugging chess move generation against published perft node counts in Java
Jun 22, 2026 Engineering

Perft Testing: How I Found 4 Move-Generation Bugs in One Afternoon

My engine played legal-looking chess, and legal-looking is not legal. Perft gave me a number that was either right or wrong, and perft divide told me exactly where the en passant, castling, promotion and file-wrapping bugs were hiding.

Read Article
A developer working through magic bitboard lookup tables and occupancy masks for a Java chess engine
Jun 17, 2026 Engineering

Magic Bitboards in Java: What Finally Made Them Click

I closed the tab the first time I read about magic bitboards. Months later the same page made sense. The intuition behind occupancy masks and blockers, concise Java code, and every bug that cost me an evening.

Read Article
A developer working through rook, bishop and queen move generation for a Java chess engine
Jun 12, 2026 Engineering

Generating Sliding Piece Moves Without Magic Bitboards (And Why I Started There)

Every resource jumped straight to magic bitboards. I skipped them and wrote the plain ray-walking generator instead — the direction arrays, the blocker logic, the bugs that ate two weekends, and why correctness beats clever optimisation.

Read Article
A developer working through the bitwise logic of representing a chess board in 64 bits
Jun 7, 2026 Engineering

Bitboards Explained: Representing a Chess Board in 64 Bits

A chess board has 64 squares; a Java long has 64 bits. The explanation I wish I'd had — why engines switch from arrays to bitboards, the bitwise tricks, move generation, and the bugs that taught me how they really work.

Read Article
A developer at a laptop building a chess engine in Java instead of another CRUD application
Jun 2, 2026 Engineering

Why I Built a Chess Engine in Java Instead of Another CRUD App

After a stack of Todo apps and inventory systems, I built a chess engine in Java. The design decisions, the minimax and alpha-beta code, the brutal bugs, and what a genuinely hard project actually teaches you.

Read Article

Explore More Resources

Back to Home About GetUp