先看一下nextLine,nextInt和next方法的原理吧:
- nextLine() 方法会以回车符作为截止,将回车符连同之前的所有字符都读取出来,然后将会车符丢掉,把读取的之前的所有字符组合成一个完整的字符串,交换给我们。
- nextInt() 方法也是以回车符作为截止,但是只读取回车符之前的所有字符,而回车符留在了消息队列中。
- next() 方法和nextInt方法一样,它们不读取回车符;但next()方法看到空格也截止,而nextLine只看到回车符才截止。
nextLine(),nextInt()连用涉及到的问题
先看一个代码(这两个方法连用时:先用nextLine方法,后用nextInt方法):
import java.util.Scanner;
public class Demo
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
System.out.println("请输入账号");
String name = input.nextLine(); //先用nextLine方法
//假定密码只能是数字
System.out.println("请输入密码");
int password = input.nextInt(); //后用nextInt方法
System.out.println("接收到了账号:" + name);
System.out.println("请输入密码:" + password);
}
}
//运行,输出没有出现问题
再看一个代码,先用nextInt方法,后用nextLine方法(此时,出现了问题)
import java.util.Scanner;
public class Demo
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
//假定密码只能是数字
System.out.println("请输入密码");
int password = input.nextInt(); //先用nextInt方法
System.out.println("请输入账号");
String name = input.nextLine(); //后用nextLine方法
System.out.println("接收到了账号:" + name);
System.out.println("请输入密码:" + password);
}
}
//问题出现了
输完密码后,还没输入账号,但是代码自动往后执行下去了
为什么呢?因为先用nextInt方法,消息队列中留下了一个回车符,然后调用nextLine方法时,它一开始就读取到回车符,直接截止(然后丢掉了回车符,相当于什么都没读取,)程序往下执行
怎么解决上面出现的问题呢?
第一种解决办法,用nextLine方法把回车符读取掉
import java.util.Scanner;
public class Demo
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
//假定密码只能是数字
System.out.println("请输入密码");
int password = input.nextInt();
input.nextLine(); //用nextLine方法把回车符读取掉
System.out.println("请输入账号");
String name = input.nextLine();
System.out.println("接收到了账号:" + name);
System.out.println("请输入密码:" + password);
}
}
第二种解决办法,利用next方法读取账号
import java.util.Scanner;
public class Demo
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
//假定密码只能是数字
System.out.println("请输入密码");
int password = input.nextInt();
System.out.println("请输入账号");
String name = input.next(); //换成next方法
System.out.println("接收到了账号:" + name);
System.out.println("请输入密码:" + password);
}
}
第三种解决办法,都使用nextLine方法(推荐使用)
上面两种方法都不太好,第一方法多了一行东西,第二种方法,消息队列中留下了一个回车符(很容易出现问题)
import java.util.Scanner;
public class Demo
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
//假定密码只能是数字
System.out.println("请输入密码");
int password = Integer.parseInt(input.nextLine());
//要将String类型的密码转化成int,用包装类
System.out.println("请输入账号");
String name = input.nextLine();
System.out.println("接收到了账号:" + name);
System.out.println("请输入密码:" + password);
}
}
写一个模拟计算器(就只包含 + - * /)
import java.util.Scanner;
class Calculator
{
public float add(float x,float y){
return x+y;
}
public float subtraction(float x,float y){
return x-y;
}
public float multiplication(float x,float y){
return x*y;
}
public float divison(float x,float y){
return x/y;
}
//设计一个方法,控制计算器计算的流程
public void calculate(){
Scanner input = new Scanner(System.in);
System.out.println("请输入第一个数字:");
float one = Float.parseFloat(input.nextLine());
while(true){
System.out.println("请输入符号:");
String symbol = input.nextLine();
if(symbol.equals("=")){ //以=作为执行结束的标志
System.out.println("执行完毕");
break;
}
if(!(symbol.equals("+")||symbol.equals("-")||symbol.equals("*")||symbol.equals("/"))){
System.out.println("输入符号有误,只能输入 + - * / 其中的一个");
continue;
}
System.out.println("请输入后面的数字:");
float two = Float.parseFloat(input.nextLine());
switch(symbol){
case "+":
one = this.add(one,two);
break;
case "-":
one = this.subtraction(one,two);
break;
case "*":
one = this.multiplication(one,two);
break;
case "/":
one = this.divison(one,two);
break;
}
System.out.println(one);
}
}
}
public class Demo
{
public static void main(String[] args)
{
Calculator demo = new Calculator();
demo.calculate();
}
}