You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 05:20:09