Java,怪异的switch语句行为

exc*_*ion 7 java switch-statement

通过一些编程任务(第一年)拖网,我想出了这个.当我运行它时,程序直接转到switch语句的默认值.现在已经连续24小时了,所以我几乎察觉不到,但我发现什么都不对.

任何人都可以指出我的写作方向.我不希望你为我做这件事

// Practical 5B - Question 1
// Nathan Griffin
// 28/02/2013
// Program to simulate a continuos system of deposits and withdraw for a bank account until user exits.

import java.util.Scanner;
public class SingleAccountSim
{
    public static void main(String [] args)
    {
        Scanner keyboardIn = new Scanner(System.in);

        BankAccount account = new BankAccount();

        int menuSelect = 0;
        double depositIn, withdrawalOut;



        do
        {
            System.out.println("*_*_*Monopoly Bank*_*_*");
            System.out.println("1. Deposit money");
            System.out.println("2. Withdraw money");
            System.out.println("3. Get balance");
            System.out.println("4. Quit");

            menuSelect = keyboardIn.nextInt();

            switch(menuSelect)
            {
                case '1':   System.out.print("Please enter the deposit amount: ");
                                depositIn = keyboardIn.nextDouble();
                                account.deposit(depositIn);
                                break;              
                case '2': System.out.print("Please enter the withdrawl amount: ");
                                withdrawalOut = keyboardIn.nextDouble();
                                account.withdraw(withdrawalOut);
                                break;
                case '3': System.out.print("Your current balance is " + account.getBalance());
                                break;
                case '4': System.out.print("Quitting.....");
                                break;
                    default: System.out.println("Invalid selection. Please try again");
            }
        }while(menuSelect !=4);

    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*Mao 13

好吧,你正在比较int(由于menuSelect = Scanner.nextInt())和a char,所以当然它不匹配.在switch语句中,该字符'1'等于49赋值给int时的值.从Java语言规范中switch语句来看,这是一个鲜为人知的事实

caseswitch语句关联的每个常量表达式必须可分配(§5.2)到switchExpression 的类型.

例如,以下(有效,令人惊讶的)代码打印49:

int a = '1';
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)

所以,case constant并且switch(expression)不需要是相同的类型,这不会为原始类型生成编译错误.您可以使用以解决此问题

switch(menuSelect) {
    case 1:
    ...
    case 2:
    ...
}
Run Code Online (Sandbox Code Playgroud)

你也可以阅读charin而不是a int,并保持原样.但是Scanner没有nextChar()方法,所以你必须使用nextByte()并转换它.

char menuSelect = (char) keyboardIn.nextByte()
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 8

您正在获取int值,但随后将其与char值进行比较.语句中的charswitch将被提升为相应的值int.

实际上,如果你键入49('1'的Unicode值),它将打印"请输入存款金额"等.

只是改变

case '1':
Run Code Online (Sandbox Code Playgroud)

case 1:
Run Code Online (Sandbox Code Playgroud)

等等