java.lang.IllegalMonitorStateException: разблокировать неизвестный монитор на java.util.Random.nextGaussian (Random.java:187) - PullRequest
4 голосов
/ 20 февраля 2012

При вызове встроенного метода 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 .

Bump!

1 Ответ

0 голосов
/ 19 апреля 2012

Я подозреваю, что это ошибка в ОС (я получаю точно такую ​​же ошибку). Вы можете попробовать использовать самодельный гауссов генератор случайных чисел. Вот что я нашел в каком-то старом коде - извините, я не могу вспомнить, откуда я его взял.

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;
}
...