使用switch case实现简易计算器的程序异常问题求助
问题分析与解决方案
嘿,我来帮你排查这个简易计算器的问题!你遇到的“输入第一个数字后程序直接退出”的情况,并不是String类型导致的,而是Scanner的输入读取逻辑在搞鬼。
问题根源
当你用keyb.nextDouble()读取第一个数字时,它只会读取输入的数字部分,不会处理数字后面的换行符(就是你按回车的那个字符)。接下来调用keyb.nextLine()时,它会直接读取这个残留的换行符,导致变量i变成了空字符串。
这时候switch语句匹配不到任何有效的运算符,直接进入default分支,打印提示后程序就执行完后续代码(关闭Scanner)退出了,看起来就像是“直接退出”。
解决方案
有两种简单的修复方式,选一种就行:
方法1:吃掉残留的换行符
在nextDouble()之后,额外调用一次keyb.nextLine()来消耗掉那个没用的换行符,再读取运算符:
num1 = keyb.nextDouble(); keyb.nextLine(); // 新增这行,吃掉数字后的换行符 System.out.print("Entrez un operateur: "); String i = keyb.nextLine();
方法2:用next()代替nextLine()读取运算符
next()方法会自动跳过所有空白字符(包括换行、空格),直接读取到下一个非空白字符为止的内容,非常适合读取单个运算符或者像sqrt这样的指令:
System.out.print("Entrez un operateur: "); String i = keyb.next(); // 把nextLine()换成next()
额外优化提示
另外,你的switch逻辑里还有个小问题:result初始值是0,比如输入+和第二个数字的话,逻辑应该是num1 + 第二个数字,但你现在写的是result + num1(也就是0+num1),后续还需要补充读取第二个数字的逻辑哦,不然当前代码只能处理像c(清零)、x(退出)、sqrt(对0开根号)这类不需要第二个数字的操作。
修正后的完整代码示例
这里用方法2来修改,同时补充读取第二个数字的逻辑(针对需要双操作数的运算符):
import java.util.Scanner; import java.math.*; public class Calculatrice { public static void main(String args[]) { double num1; Scanner keyb = new Scanner(System.in); System.out.println("Calculette Simple"); System.out.print("Valeur actuelle: "); num1 = keyb.nextDouble(); System.out.print("Entrez un operateur: "); String op = keyb.next(); // 改用next()读取运算符 double result = 0; switch (op) { case "+": System.out.print("Entrez le deuxieme nombre: "); double num2 = keyb.nextDouble(); result = num1 + num2; System.out.println("Resultat: " + result); break; case "-": System.out.print("Entrez le deuxieme nombre: "); num2 = keyb.nextDouble(); result = num1 - num2; System.out.println("Resultat: " + result); break; case "*": System.out.print("Entrez le deuxieme nombre: "); num2 = keyb.nextDouble(); result = num1 * num2; System.out.println("Resultat: " + result); break; case "/": System.out.print("Entrez le deuxieme nombre: "); num2 = keyb.nextDouble(); if(num2 == 0) { System.out.println("Erreur: Division par zero!"); } else { result = num1 / num2; System.out.println("Resultat: " + result); } break; case "sqrt": if(num1 < 0) { System.out.println("Erreur: Racine carree d'un nombre negatif!"); } else { result = Math.sqrt(num1); System.out.println("Resultat: " + result); } break; case "c": result = 0; System.out.println("Valeur reinitialisee a 0"); break; case "x": System.exit(0); break; case "^": System.out.print("Entrez l'exposant: "); double exponent = keyb.nextDouble(); result = Math.pow(num1, exponent); System.out.println("Resultat: " + result); break; default: System.out.println("Valeurs acceptees: +, -, *, /, ^, sqrt, c, x"); break; } keyb.close(); } }
内容的提问来源于stack exchange,提问作者reedy420
相关产品推荐
相关产品推荐

