为何Bubblesort()方法中list.length始终返回0?请解析原因
问题根源:变量重名导致静态数组始终是空的
嘿,这个问题其实就是典型的变量作用域冲突踩坑了!你的Bubblesort()方法里拿到的list根本不是你生成的那个装满随机数的数组,而是一开始就初始化的空静态数组,所以list.length当然返回0,排序逻辑完全没执行。
具体来说:
- 你在类的最外层定义了静态数组
static Integer list[] = { };,这个数组从始至终都是空的,长度为0。 - 到了
main方法里,你又写了Integer list[] = intList();——这里的list是局部变量,和类级别的静态list是两个完全独立的变量! - 但你的
Bubblesort()方法直接访问的是类的静态list(那个空数组),完全没碰你在main里生成的、真正要排序的局部list。所以排序等于白做,最后输出的自然和原数组一模一样。
两种修复方案任你选
方案1:直接复用静态数组(快速修复)
把main里的局部变量声明去掉,直接给静态list赋值,这样Bubblesort()就能拿到正确的数组了:
public static void main(String[] args) { Scanner eingabewert = new Scanner(System.in); System.out.print("需要排序的数字数量:"); Count = eingabewert.nextInt(); // 去掉前面的Integer,直接给静态list赋值 list = intList(); org = list.clone(); Bubblesort(); System.out.print("原数组:"); printArray(org); System.out.print("\n排序后:"); printArray(list); eingabewert.close(); }
方案2:避免静态变量(更推荐的优雅写法)
静态变量其实很容易引发这类作用域混淆的问题,更好的做法是让Bubblesort方法接收一个数组参数,直接操作传入的目标数组:
// 修改Bubblesort方法,让它接收要排序的数组 public static void Bubblesort(Integer[] arr) { int n = arr.length; int temp = 0; boolean swapped; do{ swapped = false; for (int i=0; i < n-1; ++i) { if (arr[i] > arr[i+1]) { temp = arr[i+1]; arr[i+1] = arr[i]; arr[i] = temp; swapped = true; } } n = n-1; } while (swapped); } // 然后在main里调用时,把生成的list传进去就行 public static void main(String[] args) { Scanner eingabewert = new Scanner(System.in); System.out.print("需要排序的数字数量:"); Count = eingabewert.nextInt(); Integer list[] = intList(); org = list.clone(); // 传入要排序的数组 Bubblesort(list); System.out.print("原数组:"); printArray(org); System.out.print("\n排序后:"); printArray(list); eingabewert.close(); }
这种写法不仅解决了当前问题,代码的耦合度更低,也更符合Java的面向对象编程习惯,以后维护起来也更省心。
内容的提问来源于stack exchange,提问作者Destro
相关产品推荐
相关产品推荐

