Java,怪异的switch语句行为

时间:2013-02-28 17:27:04

标签: 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);

    }
}

4 个答案:

答案 0 :(得分:13)

好吧,您要将int(由于menuSelect = Scanner.nextInt())与char进行比较,因此当然不会匹配。在switch语句中,字符'1'在分配给int时等效于49的值。从switch statement in the Java Language Specification开始,这是一个鲜为人知的事实

  

case语句关联的每个switch常量表达式必须可分配(第5.2节)到switch表达式的类型。

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

int a = '1';
System.out.println(a);

因此case constantswitch(expression)不需要是相同的类型,这不会为基本类型生成编译错误。您可以使用

解决此问题
switch(menuSelect) {
    case 1:
    ...
    case 2:
    ...
}

您还可以阅读char而不是int,并保持原样。但是,扫描程序没有nextChar()方法,因此您必须使用nextByte()并进行转换。

char menuSelect = (char) keyboardIn.nextByte()

答案 1 :(得分:8)

您获取int值,然后将其与char值进行比较。 char语句中的switch值正在提升为相应的int

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

只需更改

case '1':

case 1:

答案 2 :(得分:4)

menuSelectint'1'char,一旦转换为int49 ...只需删除引号,它应该按预期工作。

答案 3 :(得分:0)

您将输入作为int类型提取,但在您的情况下使用String参数。

将您的案例更改为:

case 1:
    // do something
    break;
case 2:
    // do something
    break;
//etc..