读写锁不能正常unlock,如何解决?

关于ReentrantReadWriteLock读写锁

ReentrantReadWriteLock tokenLock = new ReentrantReadWriteLock();
        tokenLock.readLock().lock();
        try {
            String tokenId = null;
            if (StringUtils.isEmpty(tokenId)) {
                // 上写锁之前需先释放读锁
                tokenLock.readLock().unlock();
                tokenLock.writeLock().lock();
                try {
                    // 再次获取 token,此时可能存在其他线程已经更新了这个值
                    tokenId = null;
                    if (StringUtils.isEmpty(tokenId)) {
                        int i = 1 / 0;
                        System.out.println(i);
                    }
                    // ①在释放写锁之前通过获取读锁来降级
                    tokenLock.readLock().lock();
                } finally {
                    // ②在释放写锁之前通过获取读锁来降级
                    //tokenLock.readLock().lock();
                    // 释放写锁,但是读锁还是在挂起的
                    tokenLock.writeLock().unlock();
                }
            }
            System.out.println(tokenId);
        } finally {
            tokenLock.readLock().unlock();
        }

当①开放时,报错信息为:
Exception in thread "main" java.lang.IllegalMonitorStateException: attempt to unlock read lock, not locked by current thread
当②开放时,报错信息为:
Exception in thread "main" java.lang.ArithmeticException: / by zero

测试环境①突然报了个unlock 找不到锁,根本定位不到问题所在
改为②写法,报错位置定位准确

因为在1的位置,try里面报错了,报错后后续代码都不执行了,所以你的lock根本没有执行
而lock没执行,后续直接执行了unlock,能不报错吗