scan.nextLine(); //这个空读十分关键 for(int i=0; i 这里要注意的是:在读入整数以后,不能直接按行读入。而是要先空读一行。
因为,nextInt 会越过空白,读取整数,直到遇到了下一个空白(这里就是回车),
但它不会把遇到的这个分隔符吃掉,而是留在缓冲区中。
所以,此时如果直接按行读入,就会先是空行,然后才能读到需要的内容。
而 nextLine 就不同,它不会把回车符留在缓冲区,同时也不会把回车符返回在结果串中。
这样安排有利于解决跨平台时,换行方式不一致的问题。

先是一个整数 n, 接下来有 n 行, 每行多个整数, 空格分开。要求对第每行求和

1 2 3 10 20 30 40

此数据的最后一行没有回车

import java.util.*;
public class D
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.nextLine(); // 读掉后面的一个回车符
		for(int i=0; i<n; i++){
			String s = scan.nextLine().trim();
			String[] ss = s.split(" +");  // 因为1个或多个空格分开
			int sum = 0;
			for(int j=0; j<ss.length; j++){
				sum += Integer.parseInt(ss[j]);
			System.out.println(sum);

这是比较简明的处理方法,每次把整个一行都读进来,再进行分割。
但这样处理可能有一个问题:当一行的数据太大(上百万比如),可能导致读入有问题。
如果能每次只读入一个数据项,读一个处理一个就很理想了。
所以才有方法二:

import java.util.*;
public class D2
	public static void main(String[] args){
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		scan.nextLine(); // 读掉后面的一个回车符
		scan.useDelimiter(" +");  //默认的数据项分割符是空白和回车换行都可以,这里改为若干空格
		for(int i=0; i<n; i++){
			int sum = 0;
			while(scan.hasNextInt()){
				sum += scan.nextInt();
			if(scan.hasNextLine()){  // 加 if 防止最后一行没有回车符
				sum += Integer.parseInt(scan.nextLine().trim());
			System.out.println(sum);