You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:48:16