为何length-1与length - 1写法会导致Java程序报错?
length-1和length - 1写法的误区:你遇到的错误和空格无关 你原本以为length - 1和length-1这两种写法等价,但修改循环中的length-1为length - 1后,程序抛出了NumberFormatException,报错显示试图将包含空格的字符串"1 3 6 2 7 8"转为整数,错误发生在读取length的代码行。
你的完整代码
import java.util.Scanner; import java.util.Arrays; public class continuousmedian { public static void main(String args[]) { Scanner scan = new Scanner (System.in); int cases = Integer.parseInt(scan.nextLine()); for (int set = 0; set < cases; set++) { int length = Integer.parseInt(scan.nextLine()), med = 0; String[] copy = (scan.nextLine()).split(" "); int[] test = new int[length]; for (int i = length-1; i >= 0; i--) { test [i] = Integer.parseInt(copy[i]); //System.out.println("4 is " + test[4]); Arrays.sort(test); //* System.out.print(">>"); for (int a = 0; a < length; a++) System.out.print(test [a]); System.out.println(); //*/ //System.out.println(i); int mid = length - 1 - i; if (i%2 == 0) med += test[mid]; else med += Math.floor((test[mid] + test[mid+1])/2); //System.out.println("TEST AT " + mid + " is " + test[mid]); } System.out.println(med); } } }
测试输入
2 6 1 3 6 2 7 8 7 1 3 6 2 7 8 5
错误信息
Exception in thread "main" java.lang.NumberFormatException: For input string: "1 3 6 2 7 8" at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67) at java.base/java.lang.Integer.parseInt(Integer.java:668) at java.base/java.lang.Integer.parseInt(Integer.java:784) at continuousmedian.main(continuousmedian.java:13)
核心结论:运算符的空格不影响Java代码逻辑
length-1和length - 1在Java中完全等价,编译后生成的字节码没有任何区别,不可能因为这个空格导致报错。你遇到的问题和空格写法无关,是输入读取流程出现了偏差。
错误的真正原因
报错显示第13行(读取length的代码)试图将包含空格的数字行转为整数,说明程序执行到这一步时,scan.nextLine()读取到的是本应作为数字列表的第三行内容,而不是预期的第二行长度值6。
可能的触发场景:
- 修改代码时不小心误改了其他逻辑,比如删除了某行
scan.nextLine(),或者把scan.nextLine()改成了scan.next()(next()只会读取到空格,会残留换行符导致后续读取错位); - 输入时的格式错误,比如在输入
2后多按了回车,导致空行被当作长度读取; - Scanner缓存异常(这种情况极少出现)。
验证方法
你可以将两种写法的代码分别编译,查看生成的字节码,会发现完全一致;同时检查代码中输入读取的部分,确认没有误改,再严格按照测试输入的格式运行程序,问题应该会消失。
内容的提问来源于stack exchange,提问作者Epic Coder
相关产品推荐
相关产品推荐

