java.lang.IllegalMonitorStateException: 在 java.util.Random.nextGaussian(Random.java:187) 解锁无主监视器
Posted
技术标签:
【中文标题】java.lang.IllegalMonitorStateException: 在 java.util.Random.nextGaussian(Random.java:187) 解锁无主监视器【英文标题】:java.lang.IllegalMonitorStateException: unlock of unowned monitor at java.util.Random.nextGaussian(Random.java:187) 【发布时间】:2012-03-10 08:17:06 【问题描述】:在调用内置方法nextGaussian
时会抛出IllegalMonitorStateException
:解锁未拥有的监视器
double dispersion = RAND.nextGaussian() * 0.2;
在里面
@Override
public void stroke(Canvas c, float x, float y)
这里叫
case MotionEvent.ACTION_MOVE:
style.stroke(mCanvas, x, y);
break;
return true;
然后在Surface.java
@Override
public boolean onTouchEvent(MotionEvent event)
switch (event.getAction())
case MotionEvent.ACTION_UP:
getHistory().saveState();
break;
final float x = panHelper.translateX(event.getX());
final float y = panHelper.translateY(event.getY());
return controller.onTouch(event.getAction(), x, y);
代码崩溃:
java.lang.IllegalMonitorStateException: unlock of unowned monitor .
撞!
【问题讨论】:
【参考方案1】:我怀疑这是操作系统中的错误(我遇到了完全相同的错误)。您可以尝试使用自制的高斯随机数生成器。这是我在一些旧代码中找到的一个 - 抱歉,我不记得我是从哪里得到它的。
Random rand;
Boolean RG_y2_valid = false;
Double RG_y1;
Double RG_y2;
double rand_gauss()
double x1, x2, w;
if (RG_y2_valid)
RG_y2_valid = false;
return RG_y2;
do
x1 = 2.0 * rand.nextDouble() - 1.0;
x2 = 2.0 * rand.nextDouble() - 1.0;
w = x1 * x1 + x2 * x2;
while ( w >= 1.0 );
w = Math.sqrt( (-2.0 * Math.log( w ) ) / w );
RG_y1 = x1 * w;
RG_y2 = x2 * w;
RG_y2_valid = true;
return RG_y1;
【讨论】:
以上是关于java.lang.IllegalMonitorStateException: 在 java.util.Random.nextGaussian(Random.java:187) 解锁无主监视器的主要内容,如果未能解决你的问题,请参考以下文章