|
Программирование Вопросы связанные с программированием в JAVA |
24.08.2008, 21:05
|
#1
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Не компилируется
Не хотел создавать ради этого новую тему, но после трёх часов ломания мозгов всё же решился. =) Мне стало интересно, смогу ли я декомпилировать игру и собрать её заново. Выбрал игрушку попроще, распаковал, декомпилировал, выбрал класс, над которым буду издеваться, попробовал его скомпилировать. Куча ошибок. Логически подумав над строками, в которых ошибки, пришёл к выводу, что там неправильно декомпилировались блоки try - catch, написал как надо, было ещё пара ошибок. С GOTO. Я вообще понятия не имею какой синтаксис у goto, так как юзал этот оператор только в бэйсике на БК 0100 1986 года выпуска и это было довольно давно. Но в итоге разобрался вроде, хотя там было непонятно весьма. Короче говоря, мне удалось скомпилировать класс без ошибок. Но ошибка возникла при верификации О_о
Error preverifying class Playfield
Class loading error: Wrong name
|
Playfield - это имя класса.
Компилировал через bat файл, который сам написал, через javac. Возможно у меня в команде bat файла ошибка, так как я до этого никогда не пытался скомпилировать классы, которые в итоге будут лежать на в корне jar. Там структура файлов в игре такая, что все классы не в корне, а в папке внутри jar лежат. Возможно я с путями что-то напутал, но мне кажется, что всё же причина в чём-то другом, так как когда я экспериментировал с путями, то ошибка не такая была. В общем, подскажите, в чём может быть дело. Если нужно, могу выложить саму игру и исходник, который получился у меня после исправлений.
|
(Offline)
|
|
24.08.2008, 23:06
|
#2
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Не компилируется
преверификация важн для МЕ. она проверяет соответствие cldc 1.x, при компиляции какие параметры привызове javac?
а про папки, если в начале класса написано package com.mp;
то класс должен лежать в jar в папке com/mp
|
(Offline)
|
|
24.08.2008, 23:40
|
#3
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Не компилируется
Параметры все верные написаны. Уже до этого много раз компилировал. package написан. Положил в папку, которая там написана - догадался =) Проблема не в этом. Или не совсем в этом. Мне кажется я всётаки накосячил где-то...
- - -
Вот что в bat файле написано:
cd src
..\com\bin\javac -g:none -source 1.3 -target 1.1 -classpath ..\tmpclasses;..\com\midpapi20.jar;..\com\cldcapi1 0.jar -d ..\tmpclasses bomber\Playfield.java
cd ..
com\preverify1.1.exe -classpath tmpclasses;com\midpapi20.jar;com\cldcapi11.jar -d classes bomber\Playfield
bomber - это папка. Playfield - класс. Первая часть - компиляция - работает, создаётся класс файл в tmpclasses\bomber\. Вторая часть - верификация - не работает, выдаёт вышеупомянутую ошибку.
Последний раз редактировалось Phantom, 25.08.2008 в 02:30.
|
(Offline)
|
|
25.08.2008, 02:51
|
#4
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Не компилируется
Вот исходник (уже подправленный).
|
(Offline)
|
|
25.08.2008, 11:50
|
#5
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Не компилируется
Исходник как раз нормальный. У тебя в preverify какой класс проверяется? В какой он папке лежит? В tmpclasses. А где она показана prevefiry? пиши тогда уже tmpclasses\bomber\Playfield
|
(Offline)
|
|
25.08.2008, 14:28
|
#6
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Не компилируется
Error preverifying class tmpclasses\bomber\Playfield
Class loading error: Wrong name
|
То же самое. Класс-то находит, так как если я от балды введу имя класса, то ошибка другая:
Error loading class tmpclasses\bomber\Playfields
|
Там внутри класса объявляется ещё один небольшой класс. Может что-то с этим связано? Я такого ещё не встречал. Может на его имя почему-то ругается?
|
(Offline)
|
|
25.08.2008, 15:29
|
#7
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Не компилируется
Вот сама игра. Там, внутри джар архива исходник Playfield лежит. Попробуй скомпилировать у себя, может получится.
|
(Offline)
|
|
25.08.2008, 16:51
|
#8
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Не компилируется
Уахууууууууууууууууууууу!!! Получилось скомпилировать через НетБеанс!!! Только вот очень заумно! Создал новый проект, скомпилировал мидлет по молчанию. В папке с проектом создались нужные папки. Ну я тупо их открыл, положил везде, где нужно и не нужно классы от игры, положил в src\bomber исходник Playfield, закрыл проект в НетБеансе, открыл его же, скомпилировал (!!!) без ошибок, потом вручную поменял манифест в джар архиве, добавил ресурсы и т. п. И ИГРА ПОШЛА НА ЭМУЛЯТОРЕ КАК НИ В ЧЁМ НЕ БЫВАЛО!!! WOOOW!!! В такие моменты я обычно говорю: "Вот оно - счастье!" =) Если игра была обфусцирована, то я ожидал большего, если уж я все корявости сумел исправить в декомпилированном классе, значит это не так уж и сложно... Но всё таки я не понимаю, где у меня ошибка с javac...
|
(Offline)
|
|
25.08.2008, 20:53
|
#9
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Не компилируется
Ээх... Декомпилировал какой-то мод оперы мини. Пару самых маленьких классов скомпилировать получилось, но дальше начались проблемы. Не видит переменные в других классах. Вот там видимо жёстко обфусцировано. Декомпилятор, наверно, запутался и что-то не так декомпилировал. Жаль... Я уж на радостях подумал, что теперь что угодно смогу декомпилировать-скомпилировать =)
|
(Offline)
|
|
27.08.2008, 17:12
|
#10
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Не компилируется
Я уже спрашивал, но вроде никто не ответил. Есть у меня классы g.class и b.class. В g.class объявлен метод readRes(), а в b.class объявлена переменная Graphics g.
В итоге, если я хочу обратиться из класса b к методу readRes(), вот так:
g.readRes("/res");
то компилятор выдаёт ошибку, так как у меня в классе b есть переменная g. То есть путаница видимо происходит.
Вопрос: как мне вызвать readRes() из класса b, не меняя названий переменных и классов?
|
(Offline)
|
|
27.08.2008, 18:01
|
#11
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Не компилируется
Метод как я понимаю статический? У тебя локальная переменная закрывает глобальную. Лучше учись давать классам и переменным осмысленные имена. А так создай экземпляр класса
g newG = new g();
newG.readRes("/res");
через ж.., но хоть что-то
|
(Offline)
|
|
27.08.2008, 18:50
|
#12
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Не компилируется
Ы, мне знакомые говорят, что я обфускатор ходячий. Я не знаю почему, но я всегда даю переменным короткие имена 1-3 буквы. Потом все говорят, что у меня код нечитаемый =) Но для меня переменные осмысленные, гг. Просто я максимально сокращаю, например, вместо left_key я бы создал переменную l, а если она занята, то переменную lk. =)
- - -
Так, а если метод не статический объявлять (я этого никогда не делал), то что это меняет в структуре программы? Что лучше использовать (в плане потребления и фрагментирования памяти, быстродействия и т. п.)?
|
(Offline)
|
|
27.08.2008, 21:27
|
#13
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Не компилируется
а если метод не статический, то это делать обязательно
|
(Offline)
|
|
27.08.2008, 22:46
|
#14
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Не компилируется
Хм... Ну если писать какой-нибудь класс, который будет использоваться в различных приложениях, например, типа библиотеки с функциями для чего-то, то разумнее делать нестатичные методы, дабы каждый, кто будет использовать класс, создавал его экземпляр с любым, удобным для него названием. Хотя... Если писать класс для чего-то особого, то и название ему нужно давать именно осмысленное... Блин... Нафига всякой фигни напридумывали... =)
|
(Offline)
|
|
28.08.2008, 13:52
|
#15
|
Оптимист
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений (для 259 пользователей)
|
Ответ: Не компилируется
если у тебя библиотека с функциями, то разумнее использовать как раз статические методы, а вот если класс наследник чей-то или интерфейсы имеет то тут без экземпляра не обойтись.
ЗЫ: Статические методы быстрее обычных.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:25.
|