Java中numberElements值未更新求助:方法内修改后仍显示0
问题根源:Java的参数值传递机制
这问题我太熟了!你之所以看到numberElements输出还是0,核心原因就是Java的参数传递是按值传递,不是你以为的按引用传递。
具体给你拆解下
当你把主方法里的numberElements(int类型,属于基本数据类型)传给getInfo方法时,Java会把这个变量的值复制一份,传给方法里的参数——也就是说,getInfo里的numberElements只是个“替身”,你在while循环里对它做的numberElements++,只会修改这个替身的值,完全碰不到主方法里原来那个变量。
至于数组letters能正常修改元素,是因为数组是引用类型:传递的是引用的副本,但这个副本和主方法里的引用指向的是同一个数组对象,所以修改数组元素会同步到主方法里。
给你几个解决办法
1. 让方法返回更新后的计数(最直接的方式)
修改getInfo方法的返回类型,把更新后的numberElements返回给主方法接收就行:
public static void main(String args[]) { final int ARRAY_SIZE = 100; int numberElements = 0; char[] array = new char[ARRAY_SIZE]; // 接收方法返回的更新后的值 numberElements = getInfo(array, numberElements); System.out.println(array); System.out.println("1"); System.out.println(numberElements); System.out.println(array.length); } public static int getInfo(char[] letters, int numberElements) { Scanner keyboard = new Scanner(System.in); System.out.print("Please enter some letters or -1 to quit: "); String input = keyboard.nextLine(); // 加个空判断,避免用户输入空字符串时charAt(0)报错 char characterInput = input.isEmpty() ? ' ' : input.charAt(0); while(!input.equals("-1") && numberElements < letters.length) { letters[numberElements] = characterInput; numberElements++; System.out.print("Please enter some letters or -1 to quit: "); input = keyboard.nextLine(); characterInput = input.isEmpty() ? ' ' : input.charAt(0); } // 返回更新后的计数 return numberElements; }
2. 用数组包装int值(适合需要传递多个可修改基本类型的场景)
因为基本类型没法直接通过引用传递,我们可以用一个长度为1的int数组来“包裹”这个计数,这样传递的是数组引用的副本,修改数组里的元素就会影响主方法中的值:
public static void main(String args[]) { final int ARRAY_SIZE = 100; int[] numberElements = {0}; // 用数组包装计数 char[] array = new char[ARRAY_SIZE]; getInfo(array, numberElements); System.out.println(array); System.out.println("1"); System.out.println(numberElements[0]); // 取数组里的元素 System.out.println(array.length); } public static void getInfo(char[] letters, int[] numberElements) { Scanner keyboard = new Scanner(System.in); System.out.print("Please enter some letters or -1 to quit: "); String input = keyboard.nextLine(); char characterInput = input.isEmpty() ? ' ' : input.charAt(0); while(!input.equals("-1") && numberElements[0] < letters.length) { letters[numberElements[0]] = characterInput; numberElements[0]++; // 修改数组里的计数 System.out.print("Please enter some letters or -1 to quit: "); input = keyboard.nextLine(); characterInput = input.isEmpty() ? ' ' : input.charAt(0); } }
3. 自定义一个数据类(适合复杂场景)
如果以后需要传递多个需要修改的值,可以定义一个简单的类来封装这些数据:
// 自定义一个持有数据的类 class DataHolder { int elementCount; char[] charArray; } public static void main(String args[]) { final int ARRAY_SIZE = 100; DataHolder holder = new DataHolder(); holder.elementCount = 0; holder.charArray = new char[ARRAY_SIZE]; getInfo(holder); System.out.println(holder.charArray); System.out.println("1"); System.out.println(holder.elementCount); System.out.println(holder.charArray.length); } public static void getInfo(DataHolder holder) { Scanner keyboard = new Scanner(System.in); System.out.print("Please enter some letters or -1 to quit: "); String input = keyboard.nextLine(); char characterInput = input.isEmpty() ? ' ' : input.charAt(0); while(!input.equals("-1") && holder.elementCount < holder.charArray.length) { holder.charArray[holder.elementCount] = characterInput; holder.elementCount++; System.out.print("Please enter some letters or -1 to quit: "); input = keyboard.nextLine(); characterInput = input.isEmpty() ? ' ' : input.charAt(0); } }
最后提醒一句:你的原始代码里如果用户输入空字符串,input.charAt(0)会抛出StringIndexOutOfBoundsException,上面的解决方案里都加了空判断来避免这个问题。
内容的提问来源于stack exchange,提问作者anonymousdude123
相关产品推荐
相关产品推荐

