我正在尝试理解 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 库。
如果你的代码编译,那么pb
是构造函数Thread
参数。
鉴于它是单个参数,它可能是可运行的或字符串的,因为Java ME API在线程构造函数中仅将这些对象指定为单个参数。
如果我将新线程(pb(更改为新线程((,此代码将是什么样子?
如果 pb Runnable
那么事情可能不会改变,因为 Thread 实例aaa
覆盖了 run 方法(否则会为 pb 调用(,并且因为在您的代码片段中,没有任何调用pb.run
的痕迹(这闻起来有设计错误或从您的代码片段中剪切过多的代码(。
如果 pb String
则线程aaa
的名称将是默认值,而不是 pb 值。
它会影响 val$pb 吗?
除非您发布更多代码,否则很难分辨 - 最好是SSCCE形式。
val$pb
看起来很有趣,但这可能是变量的合法标识符,假设您在代码片段中剪切了一些初始化它的内容。
在代码的第二个版本中更新,假设您初始化了private final ProgressBar val=null
- 因此,在 Run 方法语句中调用其上的方法将抛出 NPE this.val.getValue()
,并直接进入根据代码注释绘制主屏幕的 catch 块。
更新2
如果我不初始化
private final ProgressBar val
那么它会给出错误variable val might not have been initialized
那么初始化它的另一种方法是什么?
好吧,由于您的代码片段中的代码数量有限,人们只能猜测。
我想到的一种方法是使用 pb
初始化,如下所示:
//...
new Thread(pb) { private final ProgressBar val$pb = pb; // ...
如果 pb 引用进度条实例并被声明为 final,则上面的内容可能会编译。
请注意,在这种情况下,val$pb
不是很必要,因为可以使用pb
代替它(也许此变量是为代码样式首选项引入的(。
另外,鉴于您对j4me的引用,不得不承认在线程构造函数中使用ProgressBar-如果pb是此类的实例-对我来说意义不大。人们只能想知道它是如何出现在您发布的初始片段中的Thread aaa = new Thread(pb)...