I think it shows that because if your code throws another subclass of Throwable (such as Error) on the line notEmpty.signal();
then the lock won't be released.
You can argue that if there's an Error, your application will shutdown or that catching Exception
is the right thing to do in this code. I do agree on that, but as FindBugs says, there are some code paths that end up in that lock not being released... and nothing stops a developer from extending Throwable :'(.