告诉我这段代码会发生什么?

时间:2012-02-20 16:58:27

标签: java-me midp

我正在尝试理解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();

请告诉我pbThread构造函数中做了什么。如果我将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 library

1 个答案:

答案 0 :(得分:1)

如果您的代码已编译,则pbThread构造函数的参数。

鉴于它是单个参数,它可能是RunnableString,因为Java ME API仅将这些对象指定为Thread构造函数中的单个参数。

  

如果我将新线程(pb)更改为新线程(),这段代码将如何?

如果pb是Runnable,那么事情可能不会改变,因为线程实例aaa会覆盖run方法(否则会为pb调用),因为在你的代码片段中,没有任何痕迹无论如何调用pb.run(设计错误的气味或从代码片段中删除的代码太多)。

如果pb是String,那么线程aaa的名称将是默认值而不是pb值。

  

是否会影响val $ pb?

除非您发布更多代码,否则很难说 - 最好是SSCCE形式。

val$pb看起来很有趣,但这可能是变量的合法标识符,假设在代码段中你已经剪切了初始化它的东西。


在您的代码的第二个版本中

更新,假设您已初始化private final ProgressBar val=null - 因此,在run方法中调用方法的语句将抛出NPE {{1}然后根据代码注释直接进入绘制主屏幕的catch块。


<强> UPDATE2

  

如果我没有初始化this.val.getValue(),那么它会给出private final ProgressBar val错误,那么初始化它的另一种方法是什么?

您的代码段中的代码数量有限,只能猜测。

想到的一种方法是使用variable val might not have been initialized初始化,如下所示:

pb
如果pb引用ProgressBar实例并且被声明为final,那么

可以编译。

请注意,在这种情况下,//... new Thread(pb) { private final ProgressBar val$pb = pb; // ... 不是必需的,因为可以使用val$pb代替它(可能是代码样式首选项引入了此变量)。

另外,鉴于你对j4me的引用必须承认在线程构造函数中使用ProgressBar - 如果pb是这个类的一个实例 - 对我来说没什么意义。人们只能想知道在您发布pb

的初始代码段中它是如何出现的