在Java编程世界中,nextInt方法是使用频率非常高的一个方法,它是Scanner类中的一个方法,可以读取输入的下一个整数。掌握nextInt方法的使用,可以大大提高Java程序员的效率。
一、nextInt方法的声明
nextInt方法的声明如下:
public int nextInt()
该方法将从输入流中读取下一个int类型的整数,如果输入中没有整数或者输入已经结束,则抛出NoSuchElementException异常。该方法将不断阻塞等待输入流的下一个输入,因此程序需要确保输入流的下一个输入是整数。
二、nextInt方法示例
下面让我们通过一些代码示例来演示nextInt方法的使用。
1. 正常使用
下面是一个简单的代码示例,该代码从用户输入中读取一个整数:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = scanner.nextInt();
System.out.println(num);
}
}
程序运行效果如下:
请输入一个整数:
10
10
可以看到程序成功读取了用户输入的整数10。
2. 输入格式错误
下面是一个错误的输入格式示例:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = scanner.nextInt();
System.out.println(num);
}
}
当执行该程序并输入一个不是整数的字符串时,程序会抛出InputMismatchException异常。
例如输入"abc",程序运行效果如下:
请输入一个整数:
abc
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at Test.main(Test.java:7)
3. 输入结束
当输入结束,nextInt方法也会抛出NoSuchElementException异常。
比如下面这个程序,输入结束后程序会抛出NoSuchElementException异常:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = scanner.nextInt();
System.out.println("输入的整数是:" + num);
System.out.println("请输入一个字符串:");
String s = scanner.next();
System.out.println("输入的字符串是:" + s);
}
}
当执行该程序并输入一个整数后,程序会等待用户继续输入,但此时用户敲击Enter键输入已经结束了。
比如输入"10"后,程序运行效果如下:
请输入一个整数:
10
输入的整数是:10
请输入一个字符串:
Exception in thread "main" java.util.NoSuchElementException
at java.base/java.util.Scanner.throwFor(Scanner.java:937)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at Test.main(Test.java:12)
三、nextInt方法的常见陷阱
虽然nextInt方法是一个简单的输入方法,但它有一些常见的陷阱需要开发者注意。
1. 在读取数字后没有消耗掉结束符
在读取数字后,nextInt方法只消耗掉数字前的空格和换行符,如果不消耗剩下的字符,这些字符将成为下一个输入项的一部分。
比如,下面这个程序读取一个整数和一个字符串,如果在读取完整数后未使用nextLine方法,下一次调用nextLine将读取到空行,而不是输入的字符串:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = scanner.nextInt();
System.out.println("输入的整数是:" + num);
System.out.println("请输入一个字符串:");
String s = scanner.nextLine();
System.out.println("输入的字符串是:" + s);
}
}
当执行该程序并分别输入整数和字符串后,程序运行效果如下:
请输入一个整数:
10
输入的整数是:10
请输入一个字符串:
输入的字符串是:
可以看到程序并没有正确读取输入的字符串。
为了解决这个问题,可以在读取字符串前使用nextLine方法消耗掉剩下的字符:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
int num = scanner.nextInt();
System.out.println("输入的整数是:" + num);
scanner.nextLine(); // 消耗剩下的字符
System.out.println("请输入一个字符串:");
String s = scanner.nextLine();
System.out.println("输入的字符串是:" + s);
}
}
当执行该程序并输入一个整数和一个字符串后,程序运行效果如下:
请输入一个整数:
10
输入的整数是:10
请输入一个字符串:
abc
输入的字符串是:abc
2. 不检查输入是否存在
如果在读取数字之前使用hasNextInt()方法检查输入是否存在,可以避免抛出NoSuchElementException异常。
例如下面的代码,如果输入中没有整数,程序将抛出NoSuchElementException异常:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入一个整数:");
int num = scanner.nextInt();
System.out.println("输入的整数是:" + num);
}
}
}
程序运行效果如下:
请输入一个整数:
abc
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at Test.main(Test.java:8)
为了避免该问题,可以在读取数字之前使用hasNextInt()方法检查输入是否存在,如下所示:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("请输入一个整数:");
if (scanner.hasNextInt()) {
int num = scanner.nextInt();
System.out.println("输入的整数是:" + num);
} else {
System.out.println("请输入整数!");
scanner.nextLine(); // 消耗剩下的字符
}
}
}
}
程序运行效果如下:
请输入一个整数:
abc
请输入整数!
请输入一个整数:
10
输入的整数是:10
请输入一个整数:
可以看到程序现在不会抛出NoSuchElementException异常,而是直接提示用户输入整数。
四、结论
掌握nextInt方法的使用是Java程序员提高效率的必备技巧。在使用nextInt方法时需要注意一些常见的陷阱,如读取数字后没有消耗掉结束符,不检查输入是否存在等问题,这些问题都可以通过使用较少的代码来解决。通过熟练使用nextInt方法,Java程序员可以更快地开发出更加高效、可靠的程序。