скажите, что происходит с этим кодом? - PullRequest
3 голосов
/ 20 февраля 2012

Я пытаюсь понять код J2ME

Thread aaa = new Thread(pb) { private final ProgressBar val$pb;

      public void run() { while (this.val$pb.getValue() < 100) {
          try {
            this.val$pb.setValue(this.val$pb.getValue() + 1);
            Thread.sleep(10L); } catch (InterruptedException ex) {
          }
          this.val$pb.repaint();
        }
        mainForm.homeScreen = new HomeScreen();
        mainForm.homeScreen.show();
      }
    };
    aaa.start();

Пожалуйста, скажите мне, что делает pb в конструкторе Thread.Как будет выглядеть этот код, если я изменю new Thread(pb) на new Thread()?Влияет ли это на val$pb?Приведенный выше код не может быть скомпилирован, поэтому я отредактировал так:

Thread aaa = new Thread() { private final ProgressBar val=null ;//new Thread(pb) ProgressBar val$pb;

      public void run() { try {while (this.val.getValue() < 100) { //try added by me
          try {
            this.val.setValue(this.val.getValue() + 1);
            Thread.sleep(10L); } catch (InterruptedException ex) {
          }
          this.val.repaint(); //draws progress bar as a loading screen before showing home screen 
        }
      }catch(Exception e){
        mainForm.homeScreen = new HomeScreen();
        mainForm.homeScreen.show(); // draws home screen
      }
      }
    };
    aaa.start();

РЕДАКТИРОВАТЬ: - он использует библиотеку J4ME .

1 Ответ

1 голос
/ 20 февраля 2012

Если ваш код компилируется, тогда pb является параметром для Thread конструктора.

Учитывая, что это одиночный параметр, он может быть либо Runnable , либо String , поскольку Java ME API определяет только эти объекты, возможные как один параметр в Конструктор потока.

Как будет выглядеть этот код, если я изменю новую тему (pb) на новую тему ()?

Если pb равен Runnable, то, скорее всего, ничего не изменится, потому что экземпляр Thread aaa переопределяет метод run (который в противном случае вызывался бы для pb), а также потому, что в вашем фрагменте кода нет никаких следов вызова pb.run в любом случае (который пахнет ошибкой проекта или слишком большим количеством кода, вырезанного из вашего фрагмента).

Если pb равно String, то по умолчанию вместо значения pb будет использоваться имя потока aaa.

Влияет ли это на val $ pb?

Трудно сказать, если вы не отправите больше кода - желательно в SSCCE форме.

val$pb выглядит забавно, но это может быть допустимый идентификатор для переменной, если предположить, что во фрагменте кода вы вырезали что-то, что инициализирует его.


обновить во второй версии вашего кода, учитывая, что вы инициализировали private final ProgressBar val=null - в результате операторы метода run, которые вызывают методы для него, сгенерируют NPE this.val.getValue() и перейдут прямо в блок catch, который рисует домашний экран в соответствии с комментариями кода.


Update2

если я не инициализирую private final ProgressBar val, тогда выдается ошибка как variable val might not have been initialized, что может быть другим способом инициализации?

Ну, с ограниченным количеством кода в вашем фрагменте, можно только догадываться.

Один из способов, который приходит на ум, - это инициализация с pb, например:

//...
new Thread(pb) { private final ProgressBar val$pb = pb; // ...

выше может скомпилироваться, если pb ссылается на экземпляр ProgressBar и объявлен как final.

Обратите внимание, что в этом случае val$pb не совсем необходим, поскольку вместо него можно использовать pb (возможно, эта переменная была введена для предпочтений стиля кода).

Кроме того, учитывая вашу ссылку на j4me, я должен признать, что использование ProgressBar в конструкторе потоков - если pb является экземпляром этого класса - имеет для меня очень мало смысла. Можно только удивляться, как это появилось в исходном фрагменте, который вы разместили Thread aaa = new Thread(pb)...

...