java异常输出两次思考

next与nextLine的区别

next()方法:读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键,Tab键或者Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或者Enter键等视为分隔符或者结束符。next方法不能得到带空格的字符串。

nextLine()方法:结束符只是Enter键,nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。

java 复制代码
public static void nextInput(){ 	
    Scanner scan = new Scanner(System.in);
    System.out.println("请输入第一个字符串");
    String str1 = scan.nextLine();
    System.out.println("请输入第二个字符串");
    String str2 = scan.next();
    System.out.println("输入的字符串是:"+str1 + str2);
    scan.close();
          }

运行结果:

请输入第一个字符串

home work

请输入第二个字符串 over 输入的字符串是:home work over 第一种先用next,再用nextline,这里home work输入完又加了一个换行符,这个换行符被scan.nextLine()读取,所有str2输入不了,被赋值为 work

java 复制代码
public static void firstInput() {
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入第一个字符串");
        String str1 = scan.next();
        System.out.println("第一次str1读入的是:"+str1);
        System.out.println("请输入第二个字符串");
        String str2 = scan.nextLine();
        System.out.println("第二次str2读入的是:"+ str2);
        System.out.println("输入的字符串是:"+ str1 + str2);
        scan.close();
}

运行结果:

请输入第一个字符串

home work

请输入第二个字符串

第二次str2读入的是: work

输入的字符串是:home work
nextLine()自动读取了next()读取完结束符之后剩余的部分,所有没办法给str2从键盘输入值,这里解决办法就是在每一个next()语句后加一句nextLine()语句,nextDouble()、nextFloat()、nextInt()等也存在这个问题。解决办法也是语句之后加一个nextLine()语句。

java 复制代码
//不加nextLine()语句
public static void nextInputnextInt() {
        //没加nextLine()语句,输入示例如下:
        Scanner scan = new Scanner(System.in);
        System.out.println("请输入第一个数字");
        int s1 = scan.nextInt();
        String str2 = scan.nextLine();
        System.out.println("第二次str2读入的是:"+str2);
        System.out.println("第一次str1与第二次str2读入的是:"+ s1 + str2);
        scan.close();
}

请输入第一个数字

-111 -67

-111

第二次str2读入的是: -67

第一次str1与第二次str2读入的是:-111 -67

java 复制代码
////加nextLine()语句
public static void nextTest(){
    // 加上scan.nextLine();解决后可以正常输入
    Scanner scan = new Scanner(System.in);
    System.out.println("请输入第一个数字");
    String s1 = scan.next();
    scan.nextLine();
    System.out.println(s1);
    System.out.println("请输入一个字符串");
    String str2 = scan.nextLine();
    System.out.println("第二次str2读入的是:"+str2);
    System.out.println("第一次s1与第二次str2读入的是:"+ s1 + str2);
    scan.close();
}

请输入第一个数字

666 -99

666

请输入一个字符串

老铁

第二次str2读入的是:老铁

第一次s1与第二次str2读入的是:666老铁

自己遇到的问题

代码如下:

java 复制代码
package chapter8.homework3_2;

import java.util.InputMismatchException;
import java.util.Scanner;

class IllegalInputException extends RuntimeException{
	public IllegalInputException(String message) {
		super(message);
	}
	
}
public class CalRadio {
	double radio;
	double bill;
	public void calRadio(int electricity) {
		if(electricity < 0) {
			throw new IllegalInputException("度数必须大于0");
		}
		else if(electricity <= 240) {
			bill = electricity * 0.5;
		}
		else if(electricity <= 400) {
			bill = electricity * 0.53;
		}
		else {
			bill = electricity * 0.78;
		}
		String str = String.format("电费为:%.0f,电费与用电量比值为:%.2f", bill,bill/electricity);
		System.out.println(str);
	}
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		System.out.println("输入本月用电度数");
//		写在这里不能输入下个用电量,因为一直读取的都是之前的用电量
		int electricity = scan.nextInt();
		while(true) {
			try {
				CalRadio radio = new CalRadio();
				System.out.println("电量是"+electricity);
				radio.calRadio(electricity);
				break;
			}catch(InputMismatchException e) {
				System.out.println("输入用电数不是整数类型,请重新输入");
				scan.nextLine();
			}catch(IllegalInputException ee) {
				System.out.println(ee);
				scan.nextLine();
			}
		}
		scan.close();
	}

}
makefile 复制代码
输入本月用电度数
-9
电量是-9
chapter8.homework3_2.IllegalInputException: 度数必须大于0
电量是-9
chapter8.homework3_2.IllegalInputException: 度数必须大于0

这里用电度数输入为-9时,会报两次异常。个人通过了解scan.nextLine()的用法得知,是因为当输入-9时,会带一个回车,而scan.nextInt()只会仅读取整数部分,并会在读取到整数之后停止,留下输入流中整数后面的任何字符(包括空格、制表符或换行符)。这时捕抓到异常,scan.nextLine()读取开始的位置是:scan.nextInt()读取完成的下一个位置,这里是换行符,读取完,再次进入while循环,然后electricity变量的值没有变,所以再报一次异常,此时scan.nextLine()已经读取不到什么内容,等待用户输入,自然停止下来。如果按下回车符,会再次出现异常。

相关推荐
阳光是sunny8 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦8 小时前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny8 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
皮皮林5518 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
努力的小雨9 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康10 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
腾渊信息科技公司10 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
IT_陈寒11 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
码事漫谈12 小时前
1999年的电商前夜和2026年的AI前夜 历史押韵但从不重复
后端