finally節にreturn があることが原因でした。
ありがとうございます。
hoge() {
    semaphore.tryAcquire();
    int data = 0;
    try {
        // IOEceptionの可能性がある処理
    } catch (Exception e) {
        throw e;
    } finally {
        semaphore.release();
    }
    return data;
}