从FindBugs中学Java【二】

    IMSE_DONT_CATCH_IMSE

java.lang 

Class IllegalMonitorStateException

java.lang.Object

  java.lang.Throwable

      java.lang.Exception

          java.lang.RuntimeException

              java.lang.IllegalMonitorStateException

All Implemented Interfaces:

Serializable

public class IllegalMonitorStateException

extends RuntimeException

Thrown to indicate that a thread has attempted to wait on an object's monitor or to notify other threads waiting on an object's monitor without owning the specified monitor.

 

这个问题大抵是因为给错误的对象使用了诸如notify(),wait()等方法,所以抛出java.lang.IllegalMonitorStateException

给实际上加锁的对象进行操作就可以了。

例如:

public class ThreadTest {
 public static void main(String[] args) {
  new Thread(new ThreadDemo()).start();
 }
}
class ThreadDemo implements Runnable {
 private int i = 0;
 public synchronized void run() {
  try {
   ThreadTest.class.wait();
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  System.out.println(Thread.currentThread().getName() + ":" + i);
 }
}

 妥妥地

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
 at java.lang.Object.wait(Native Method)
 at java.lang.Object.wait(Object.java:503)
 at com.github.alaahong.ThreadDemo.run(ThreadTest.java:14)
 at java.lang.Thread.run(Unknown Source)

 只需将其中的

ThreadTest.class.wait();

 改成

this.wait();

 即可。

Ref:1  2  3  4

 

 

 

 

你可能感兴趣的:(从FindBugs中学Java【二】)