Igor Kromin |   Consultant. Coder. Blogger. Tinkerer. Gamer.

I've been doing some tricky debugging recently where I had to provide one of my web services that required the environment it ran in configured a very particular way. The developer I was working with did not have such an environment and there was no time to set one up properly. This was a bit of a dilemma, however the issue we were trying to debug didn't require my service to fully execute, it was sufficient to get to a particular point in the execution and exit, this could be done on a vanilla system.

The naive solution is to put in an early return statement in the code. However, the Java compiler detects this and you get a compiler unreachable statement error. There is a way around this though!

Lets look at some code to illustrate this.
 Test.java
public class Test {
public void doSomething() {
int i = 1;
int j = 2;
int k = i + j;
if (k != 3) {
throw new RuntimeException("Expecting 3!");
}
}
}


This code doesn't do anything useful, but for example purposes lets say we needed to return early from the method before the 'int k = i + j;' line was executed. We could try inserting a return statement like this...
 Test.java
...
int j = 2;
return;
int k = i + j;
...


Of course this would get a compile error...
Test.java:9: error: unreachable statement
int k = i + j;
^
1 error




So how do we trick the compiler in letting us return early? It's as simple as adding an invariant true condition to the return statement thus:
 Test.java
...
int j = 2;
if (1 == 1) {
return;
}
int k = i + j;
...


The condition inside the if statement will always evaluate to true (unless you're doing quantum computing maybe) so we will always execute the return statement and the compiler will not complain.

This is a trick and abuse of the language so it should not be used in normal programming situations, but under certain conditions this can make an invaluable debugging tool.

-i

A quick disclaimer...

Although I put in a great effort into researching all the topics I cover, mistakes can happen. Use of any information from my blog posts should be at own risk and I do not hold any liability towards any information misuse or damages caused by following any of my posts.

All content and opinions expressed on this Blog are my own and do not represent the opinions of my employer (Oracle). Use of any information contained in this blog post/article is subject to this disclaimer.
Hi! You can search my blog here ⤵
NOTE: (2022) This Blog is no longer maintained and I will not be answering any emails or comments.

I am now focusing on Atari Gamer.