V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
theotheo
V2EX  ›  问与答

求问这段 Java 代码为什么和预期不符?

  •  
  •   theotheo · 2020-03-20 17:19:52 +08:00 · 1013 次点击
    这是一个创建于 1505 天前的主题,其中的信息可能已经有所发展或是发生改变。
    import java.util.Scanner;
    public class Test {
    public static void main(String args[]){
    Scanner scanner = new Scanner(System.in);
    int length = scanner.nextInt(), target = scanner.nextInt(), i = 0;
    int[] arr= new int[length];
    while(scanner.hasNext() && i < length){
    arr[i++] = scanner.nextInt();
    }
    }
    }
    例如输入:2 1 7 1,本来程序应该终止,但是这个时候还需要再输入一个,才能终止,请问是为什么?
    谢谢大家。
    7 条回复    2020-03-20 17:43:37 +08:00
    coderluan
        1
    coderluan  
       2020-03-20 17:23:19 +08:00
    没细看,i++ ,++i ?
    Newyorkcity
        2
    Newyorkcity  
       2020-03-20 17:27:07 +08:00
    i++ 表达式,返回增加后的值
    ++i 表达式 返回增加前的值
    两者都导致 i 加一
    chainzhao188
        3
    chainzhao188  
       2020-03-20 17:29:28 +08:00
    才疏学浅,没明白这段代码要干什么
    littleylv
        4
    littleylv  
       2020-03-20 17:37:03 +08:00
    scanner.hasNext()
    passerbytiny
        5
    passerbytiny  
       2020-03-20 17:40:12 +08:00
    你这段代码是要干啥,我真得不想花心思去分析。
    length 等于你第一次输入的数值,即 2,那么 arr[2]的时候抛出异常(但你的循环是正常结束的,而不是抛异常)。你这个循环,第一次循环 i=0,然后每执行一次循环体 i 自增。第一次循环 i=0,arr[i++] 即 arr[0],没问题;第二次 arr[1],没问题;第二次循环执行后,i=2 ;第三次循环判断的时候,2<length 过不去了,循环就结束了。总共来说,循环结束前,经历了三次 while 判断,两次循环体执行。加上前面代码的 scanner.nextInt(),总共要 5 个。
    nziming
        6
    nziming  
       2020-03-20 17:42:44 +08:00   ❤️ 1
    i < length 放到前面就可以了, 原因是 scanner.hasNext()是一个阻塞方法, 会阻塞直到接收到输入
    littleylv
        7
    littleylv  
       2020-03-20 17:43:37 +08:00   ❤️ 1
    scanner.hasNext() 是阻塞的,只要没输入,就永远等在那里,不会进入 while 判断
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2306 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:24 · PVG 13:24 · LAX 22:24 · JFK 01:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.