{ int num = 1/0; lock.lock(); }finally{ lock.unlock(); } } 此时正常我们所期望能出现的崩溃信息是...java.langArithmeticException: /by zero,但是实际出现的异常则是:(出现的异常是:java.lang.IllegalMonitorStateException) 这和我们所期望的异常是不一样的...真实的崩溃信息被覆盖掉了 原因是: 因为上述代码无论是否会抛出异常,finally中的代码块都会被执行,最后会调用unlock()方法。...而unlock()方法最终会调用ReentrantLock$Sync. tryRelease()方法,然后会判断当前线程是否是拥有锁的线程,如果不是则会抛出异常,从而会将真实的崩溃信息覆盖掉。...写在外面的话,lock()方法抛出异常的话就不会执行后续代码了。 既然unlcok()方法会抛出异常,为什么要写在finally代码块中呢?
它为什么会在1号线程等待的时候,2号线程运行了呢,它不应该是要等待1号线线程中的锁释放了才能运行的吗?又为什么会报两个错呢?...为什么会报Exception in thread "Thread-0" 错 为什么会报java.lang.IllegalMonitorStateException 错 那么带着问题我们来分析下这段代码...这也解释了前面的问题,为什么2号线程会运行。...只有拥有该对象monitor的线程才可以调用该对象的notify()和notifyAll()方法;如果没有该对象monitor的线程调用了该对象的notify()或者notifyAll()方法将会抛出java.lang.IllegalMonitorStateException...至于为什么会报Exception in thread "Thread-0" 错,这个错跟后面的IllegalMonitorStateException是同一个错,只是因为当时线程休眠了,没有执行完而已。
为什么使用Mock 1.解除依赖,团队并行工作 接口尚未开发完成,在系统交互双方定义好接口之后,我们可以提前进行开发和测试,并不依赖上游系统的开发实现。...分为单元测试级别的Mock工具和接口测试级别的Mock工具 单元测试级别的mock工具 单元测试级别的Mock工具有Easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit...它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。...Mock工具对比 Features: Feature EasyMock jMock Mockito UnitilsMock PowerMock(EasyMock) PowerMock(Mockito) JMockit...14/14 Qualities: Feature EasyMock jMock Mockito UnitilsMock PowerMock(EasyMock) PowerMock(Mockito) JMockit
在 WPF 框架里面,从框架层阻止了开发者对自定义的 UserControl 用户控件跨程序集继承的逻辑,一旦尝试进行跨程序集继承,将在运行时抛出异常。...本文将从源代码的角度告诉大家 WPF 框架是如何阻止跨程序集继承 先来写一些演示使用的代码,新建一个 WpfLibrary1 项目用来存放自定义的用户控件。....xaml 是期望从 WpfLibrary1 程序集获取对应的 XAML 定义资源(准确来说是 BAML 资源)进行加载。...但实际的调用类型,却发现是继承的类型,放在另一个程序集,不符合框架设计的预期,抛出异常 这就是为什么自定义的 UserControl 用户控件不能跨程序集继承的原因 在 WPF 的 LoadComponent...方法是比较复杂的,本文只是将里面相关代码写出来,具体是如何调用的,我是通过调试的方法了解的 调试的方式我录了视频放在哔哩哔哩,请看 为什么自定义的 UserControl 用户控件不能跨程序集继承_哔哩哔哩
程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。异常发生时,是任程序自生自灭,立刻退出终止。在Java中即,Java在编译或运行或者运行过程中出现的错误。...throw — 用于抛出异常。 throws — 用在方法签名中,用于声明该方法可能抛出的异常。主方法上也可以使用throws抛出。...IllegalMonitorStateException 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。...,抛出该异常。...在catch捕获异常时,为什么不考虑使用Throwable类型,而只是使用Exception来进行接收? Throwable表示的范围要比Exception大。
@throws IllegalMonitorStateException if the current thread is notthe owner of the object 's monitor....抛出 InterruptedException 异常。...为什么 wait 必须在 synchronized 保护的同步代码中使用? 逆向思考下,没有 synchronized 保护的情况下,我们使用会出现啥问题?...当前线程不持有对象的 monitor 锁,抛 IllegalMonitorStateException 异常。...它们都可以响应 interrupt 中断,并抛出 InterruptedException 异常。 不同点: wait 是 Object 类的方法,而 sleep 是 Thread 类的方法。
为什么wait 和notifyAll(notify) 必须要使用synchronized?...this){ this.wait(); } synchronized fun(){ this.wait(); } 如果不用在synchronized里面就会报错: java.lang.IllegalMonitorStateException...在JVM中是通过检查当前线程是否为对象的OWNER来判定是否要抛出相应的异常,由此可见他希望该动作由Java程序抽象层来控制。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。
当 timeout 是负数的时候,这个方法抛出 java.lang.IllegalArgumentException。...注意: 若当前线程开始或正在等待通知,任意线程中断了它,3 个 wait() 方法都会抛出 java.lang.InterruptedException。...为什么 wait 方法定义在 Object 类里面,而不是 Thread 类?...同步和等待是两个不同的领域,同步是提供互斥并确保 Java 类的线程安全的,wait 和 notify 是两个线程之间的通信机制 保证每个对象都可上锁 为什么 wait 方法要放到同步块中?...如下述代码,加锁的是 obj 对象,notify 却是 anotherObj 对象使用,会抛出 IllegalMonitorStateException 异常。
大家可能会觉得奇怪为什么会抛出异常?而抛出的IllegalMonitorStateException异常又是什么?...所以上面之所以会抛出异常,是因为在调用wait方式时没有获取到monitor对象的所有权,那如何获取monitor对象所有权?...IllegalMonitorStateException异常,wait方法的作用就是阻塞当前线程等待notify/notifyAll方法的唤醒,或等待超时后自动唤醒。...至于为什么,大家可以先思考一下。...最后回答一下上面提出的问题:wait/notify/notifyAll方法的作用是实现线程间的协作,那为什么这三个方法不是位于Thread类中,而是位于Object类中?
但是,这里存在一个问题,当线程被唤醒的时候,为什么检测到线程被中断不直接抛出 InterruptedException 而是要等到获取锁成功之后呢?...因为 await 方法的原则是,怎么进来的怎么出去,他只是让线程休眠一段时间,他不会因为线程被中断就让本来持有锁的线程在退出方法时没有持有锁,这样的话,用户去释放锁的时候就会抛出意外的异常 java.lang.IllegalMonitorStateException...isHeldExclusively()) throw new IllegalMonitorStateException(); Node first = firstWaiter;...isHeldExclusively()) throw new IllegalMonitorStateException(); Node first = firstWaiter;
第二次执行的时候,就会报错,如下:java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current...可是为什么会报错呢?所以,我们需要先去搞清楚具体的执行流程。...显然这样写代码,不是我们所期望的,并且代码也有问题。...而 lock 会报错,报错信息如下:java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current
t = next; // 指向下一个节点 } } 2 fullyRelease(Node node) 使用当前状态值调用release;返回保存的状态;在失败时取消节点并且抛出异常...{ failed = false; return savedState; } else { throw new IllegalMonitorStateException...= getExclusiveOwnerThread()) throw new IllegalMonitorStateException(); boolean free = false...isHeldExclusively()) throw new IllegalMonitorStateException(); // 目标节点设置为等待队列中的头节点...return t; } } } } // 硬件级别的原子控制; headOffset表示head头的内存中的偏移位置 // 4各参数:对象、偏移位置、期望值
✎二、必须要知道的运行时异常 ArithmeticException 是出现异常的运算条件时,抛出此异常。 例如,一个整数“除以零”时,抛出此类的一个实例。...IllegalMonitorStateException 抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程 IllegalPathStateException...InvalidOpenTypeException 当开放数据 值的开放类型 不是期望的类型时,抛出此运行时异常。...指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出 InputMismatchException 由 Scanner 抛出,表明获取的标记与期望类型的模式不匹配,或者该标记超出期望类型的范围...方法抛出,表明枚举中没有更多的元素。
在决定使用受检的异常或是未受检的异常时,主要原则是:如果期望调用者能够恰当地恢复,对于这种情况就应该使用受检的异常。通过抛出受检的异常,强迫调用者在一个catch子句中处理该异常,或者将它传播出去。...如果方法抛出的异常与它所执行的任务没有明显的联系,这种情形将会使人不知所措。当方法传递由底层抽象抛出的异常时,往往会发现这种情况。...总而言之,如果不能阻止或者处理来自更底层的异常,一般的做法是使用异常转译,除非底层方法碰巧可以保证它抛出的所有异常对高层也合适才可以将异常从底层传播到高层。...要想使方法具有失败原子性,以下几种途径可以实现这种效果: 最简单的方法莫过于设计一个不可变的对象,如果一个操作失败了,它可能会阻止创建新的对象,但是永远也不会使已有的对象保持在不一致的状态之中;对于在可变对象上执行操作的方法...至少,catch块也应该包括一条说明,解释为什么可以忽略这个异常。此外,错误(相对于异常)通常是不可恢复的,当方法抛出错误时,它们不需要努力保持失败原子性。
为什么要进行单元测试? 有时,软件开发人员会尝试通过进行最少的单元测试来节省时间。这是一个谬误,因为跳过单元测试会导致在应用程序完成后的系统测试,集成测试乃至Beta测试期间更高的缺陷修复成本。...JMockit:JMockit是开源的单元测试工具。它是具有行和路径度量的代码覆盖工具。它允许带有记录和验证语法的模拟API。该工具提供行覆盖率,路径覆盖率和数据覆盖率。...单元测试的缺点 不能期望单元测试发现程序中的每个错误。即使在最简单的程序中,也无法评估所有执行路径 单元测试的本质就是将重点放在代码单元上。因此,它无法发现集成错误或广泛的系统级错误。
lockInterruptiblyDemo$1(Xxx.java:39) at java.lang.Thread.run(Thread.java:748) Exception in thread "t1" java.lang.IllegalMonitorStateException...lockInterruptiblyDemo$1(Xxx.java:44) at java.lang.Thread.run(Thread.java:748) 获取锁之前会判断中断标志位,也就是说可以中断获取锁的线程并抛出异常...面试题 为什么AQS中的链表要设计成双向链表? 排队等待锁,需要修改前一个节点的状态 唤醒锁的时候:从头结点往后遍历
在同步代码块中,锁对象是谁,就用那个对象来调用wait和notify 为什么wait方法和notify方法需要定义在Object? ...} } }.start(); } } // 等待唤醒机制 /* * 在同步代码块中,锁对象是谁,就用那个对象来调用wait和notify * 为什么...在调用 Condition、waiting 或 signalling 这些方法中的任意一个方法时,如果没有保持此锁,则将抛出 IllegalMonitorStateException。...如果线程在等待时被中断,则等待将终止,并将抛出 InterruptedException,清除线程的中断状态。 等待线程按 FIFO 顺序收到信号。...通常,将抛出一个异常(比如 IllegalMonitorStateException)并且该实现必须对此进行记录。 与响应某个信号而返回的普通方法相比,实现可能更喜欢响应某个中断。
领取专属 10元无门槛券
手把手带您无忧上云