Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > boolean cannot be dereferenced


Автор: медбрат 1.6.2011, 04:45
Всучили мне набор классов. Без исходников. Бывает и такое.
И часть из них после декомпиляции, даже без поправок, отказывается компилироваться обратно.
фрагмент с ошибками:
Код

        if(I() || !P())
            return bp.e; //boolean cannot be dereferenced

        if(aH.o.c)
            return bp.b; //boolean cannot be dereferenced

        if(aH.d())
            return bp.c; //boolean cannot be dereferenced


а это bp.java:
Код

public final class bp extends Enum
{

    public static bp[] values()
    {
        return (bp[])$VALUES.clone();
    }

    public static bp valueOf(String s)
    {
        return (bp)Enum.valueOf(bp, s);
    }

    private bp(String s, int i)
    {
        super(s, i);
    }

    public static final bp a;
    public static final bp b;
    public static final bp c;
    public static final bp d;
    public static final bp e;
    private static final bp $VALUES[];

    static 
    {
        a = new bp("a", 0);
        b = new bp("b", 1);
        c = new bp("c", 2);
        d = new bp("d", 3);
        e = new bp("e", 4);
        $VALUES = (new bp[] {
            a, b, c, d, e
        });
    }
}


Автор: Stolzen 1.6.2011, 06:55
Цитата

"<primitive> cannot be deferenced" means that you're trying to call a method on a primitive data type.


Видимо, в первом куске кода что-то еще такое есть, может быть, boolean bp? Можно первый кусок кода целиком? (Если не слишком большой)

Наверное, такое бывает, что декомпилятор неправильно декомпилирует - сам никогда не сталкивался. 

Да, этот самый bp, как уже вы наверное поняли, это 

Код

Enum bp {
    a, b, c, d, e;
}

Автор: медбрат 1.6.2011, 16:59
Цитата(Stolzen @ 1.6.2011,  06:55)
Цитата

"<primitive> cannot be deferenced" means that you're trying to call a method on a primitive data type.


Видимо, в первом куске кода что-то еще такое есть, может быть, boolean bp? Можно первый кусок кода целиком? (Если не слишком большой)

Наверное, такое бывает, что декомпилятор неправильно декомпилирует - сам никогда не сталкивался. 

Да, этот самый bp, как уже вы наверное поняли, это 

Код

Enum bp {
    a, b, c, d, e;
}

Насчет bp так же думаю.
И да, похоже применялся обфускатор.
Первый кусок - вместе с началом функции:
Код

    public bp a(int i1, int j1, int k1)
    {
        if(I() || !P())
            return bp.e;
        if(aH.o.c)
            return bp.b;
        if(aH.d())
            return bp.c;
        if(Math.abs(aL - (double)i1) > 3D || Math.abs(aM - (double)j1) > 2D || Math.abs(aN - (double)k1) > 3D)
            return bp.d;
        b(0.2F, 0.2F);
        be = 0.2F;

Автор: Stolzen 2.6.2011, 07:57
Сделайте поиск "boolean bp" по файлу. Находит что-нибудь?

Автор: LSD 2.6.2011, 09:15
Лучше взять javap и посмотреть байткод проблемного метода.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)