Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> мистический exception, как-то связан с кодировкой, странный exception, кот убивает мидлет 
:(
    Опции темы
vicvic
Дата 20.12.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.12.2008

Репутация: нет
Всего: нет



Значит есть такой простенький мидлетик
Код

public class test2 extends MIDlet implements CommandListener {

  private Display display = null;
  private StringItem stritem = new StringItem("", "");
  private Form form = new Form("test2");
  private Command cmndExit = new Command("Exit", Command.BACK, 0);

  public void startApp() {
    if (display == null) {
      initApp();
    }
  }

  public void initApp() {
    try {
      if (display == null) {
        display = Display.getDisplay(this);
        form.append(stritem);
        form.setCommandListener(this);
        form.addCommand(cmndExit);
        display.setCurrent(form);
      }
      stritem.setText("init app");
      playSound(0, false);
    } catch (Exception e) {
      
    }
  }

  public void playSound(int type, boolean vibrate) {
    try {
      if (vibrate) display.vibrate(1000);
      InputStream is;
      is = getClass().getResourceAsStream("/notify.wav");
      stritem.setText("А теперь звук...");
      Player player = Manager.createPlayer(is, "audio/X-wav");
      player.start();
      stritem.setText("лай-лай-лай...");
      if (vibrate) display.flashBacklight(1000);
    } catch (Exception e) {
      stritem.setText("e: " + e.toString());
    }
  }

  public void pauseApp() {

  }

  public void destroyApp(boolean unconditional) {
    notifyDestroyed();
  }

  public void commandAction(Command command, Displayable displayable) {
    notifyDestroyed();
  }
}


при дебаге с выводом всех эксепшенов на дефалтколорфоне на строчке
Код
is = getClass().getResourceAsStream("/notify.wav");

происходит целый ряд мистических вещей, а именно

1. Exception 'java.lang.ClassNotFoundException' occurred in thread 'KVM_main'
в классе com.sun.cldc.i18n.Helper, функция
private static com.sun.cldc.i18n.StreamWriter getStreamWriterPrim(java.lang.String string) throws java.io.UnsupportedEncodingException { /* compiled code */ }

2. Exception 'java.lang.ClassNotFoundException' occurred in thread 'KVM_main'
в классе com.sun.cldc.i18n.Helper, функция
private static com.sun.cldc.i18n.StreamReader getStreamReaderPrim(java.lang.String string) throws java.io.UnsupportedEncodingException { /* compiled code */ }

3. Exception 'java.io.IOException' occurred in thread 'KVM_main'
в классе com.sun.mmedia.WavPlayer, функция 
public void run() { /* compiled code */ }

При этом звук нормально проигрывается, и мидлет работает дальше без каких-либо видимых проблем. Причем в этом примере если выйти из мидлета (но не выходя из эмулятора) и запустить его заново, то первых двух эксепшенов уже не будет. Стеки и значения переменных на скриншотах в аттаче (1 и 2 первый ексепшн, 3 и 4 - второй)

НО! Кроме спортивного интереса что это должно значить, есть вполне практическая проблема - в реальном проекте таже фигня происходит на строчке player.start(); и при этом мидлет умирает! В смысле выполнение вызвавшей функции не продолжается, хотя на нажатие клавиш реагирует. При чем на некоторых реальных девайсах проект работает нормально и без проблем, на других - умирает с теми же симптомами, как и в эмуляторе.

Покопался в исходниках на java2s.com и если правильно понимаю, то проблема не в плеере, а в обработке строк и кодировках. Если судить по исходникам, то он должен искать com.sun.cldc.i18n.j2me.Cp1251_Reader.java и Cp1251_Writer.java, коих есессно в библиотеке нет. В качестве эксперимента скопировал и переименовал ISO8859_1_Writer/Reader, но картина не поменялась. Не знаю правда, то ли он другой класс исчет, то ли исходники на j2s устарели, то ли классы в com.sun.cldc нельзя добавить. И ещё в тех же исходниках сказано, что 
Код

defaultEncoding = System.getProperty("microedition.encoding");
if (defaultEncoding == null) {
   defaultEncoding = "ISO-8859-1";
}

getProperty("microedition.encoding") дает нул, но при дебаге в defaultEncoding сидит Cp1251. Откуда оно там взялось тоже не понятно...

В общем подскажите граждане как это мона объяснить и главное как с этим пробовать бороться, уж очень хоца расширить список поддерживаемых девайсов. Сори что так длинно, сильно трабла загадочная  smile 

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  test2.rar 140,57 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0656 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.