构造函数初始化私有数组遇变量遮蔽,无法后续使用该数组怎么办?
问题:私有数组在构造函数中被当作局部变量,导致后续线程无法访问
我正在完成学校的编程练习,要求将数组声明为私有,仅通过构造函数对其进行实例化。我的代码如下:
public class Mapland extends Thread { private int groining; private int[] sepulcher; public Mapland(int[] b) { int[] sepulcher = new int[b.length]; } public int getGroining() { return this.groining; } public void run() { groining = Integer.MIN_VALUE; for (int i = 0; i < sepulcher.length; i++) { if (getGroining() < this.sepulcher[i]) { this.groining = this.sepulcher[i]; try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
问题在于构造函数中的sepulcher被当作局部变量处理,导致我后续无法使用该数组。尝试在其前添加this.也没有效果,请问我该如何解决?
解决方案:正确初始化私有数组并复制传入内容
嘿,这问题我熟,帮你捋清楚!
你现在的核心问题有两个:
- 构造函数里重新声明了局部变量
int[] sepulcher,直接把类的私有成员变量给“屏蔽”了——相当于你在构造函数里新建了一个和成员变量同名的局部数组,和类里的sepulcher半毛钱关系都没有。 - 就算你去掉了局部声明,你也只是给数组分配了空间,没把传入的
b数组内容复制进去,这样你的私有数组只是个空架子,后续遍历也没意义。
修改后的构造函数应该是这样的:
public Mapland(int[] b) { // 直接给类的私有成员数组赋值,不要重新声明变量 this.sepulcher = new int[b.length]; // 把传入数组b的内容复制到私有数组里,两种方式选一个就行 System.arraycopy(b, 0, this.sepulcher, 0, b.length); // 或者用循环复制: // for (int i = 0; i < b.length; i++) { // this.sepulcher[i] = b[i]; // } }
再给你补个小细节:在run()方法里最好加个空指针判断,避免构造函数没正确初始化数组导致的异常,优化后的run()方法:
public void run() { groining = Integer.MIN_VALUE; // 先判断数组是否有效 if (sepulcher == null || sepulcher.length == 0) { return; } // 用增强for循环更简洁 for (int num : sepulcher) { if (getGroining() < num) { this.groining = num; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
这样修改后,私有数组就能被正确初始化,线程里也能正常访问并使用它了。
内容的提问来源于stack exchange,提问作者GeorgeNoob
相关产品推荐
相关产品推荐

