Java switch case始终运行默认代码

时间:2016-03-03 23:10:02

标签: java switch-statement

switch case始终运行默认代码。我读了一些关于"新线"问题,但我认为这不是这种情况。因为我从" stringclient"复制了第一个字符。字符串转换为char变量。但是当我在eclpise中使用我的ATMServer类运行它时,它的工作正常。只有当我从cmd执行它们时,才会出现此问题。所以任何人都知道发生了什么?请帮忙。感谢。

import java.io.*;
import java.net.*;

public class ATMClient {

    private static final int PORT = 20000;

    private static final char DRAW_STR = 'Α';
    private static final char DEPOSIT_STR = 'Κ';
    private static final char BALANCE_STR = 'Υ';
    private static final char EXIT_STR = 'Ε';

    private static boolean hasEnded = false;

    public static void main(String args[]) throws IOException {
        Socket dataSocket = new Socket("localhost",PORT);
        InputStream is = dataSocket.getInputStream();
        BufferedReader in = new BufferedReader(new InputStreamReader(is));

        OutputStream os = dataSocket.getOutputStream();
        PrintWriter out = new PrintWriter(os, true);


        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));

        String stringclient;

        while(!hasEnded){
            printMenu();

            stringclient = input.readLine();

            char optionCode = stringclient.charAt(0);
            String tempData;
            int amount;

            switch(optionCode){
            case EXIT_STR:
                out.println(String.valueOf(EXIT_STR));
                hasEnded = true;
                continue;
            case DRAW_STR:
                tempData = stringclient.substring(1);

                try{
                    amount = Integer.parseInt(tempData);
                }catch(NumberFormatException e){
                    System.out.println("Το ποσό πρέπει να είναι αριθμός. Δοκιμάστε ξανά.");
                    System.out.println();
                    continue;
                }

                if(amount > 420){
                    System.out.println("Μπορείτε να κάνετε ανάληψη έως 420 ευρώ.");
                    System.out.println();
                    continue;
                }

                out.println(String.valueOf(DRAW_STR) + amount);
                break;

            case DEPOSIT_STR:
                tempData = stringclient.substring(1);

                try{
                    amount = Integer.parseInt(tempData);
                }catch(NumberFormatException e){
                    System.out.println("Το ποσό πρέπει να είναι αριθμός. Δοκιμάστε ξανά.");
                    System.out.println();
                    continue;
                }

                out.println(String.valueOf(DEPOSIT_STR) + amount);

                break;

            case BALANCE_STR:
                out.println(String.valueOf(BALANCE_STR));
                break;

            default:
                System.out.println("Λάθος επιλογή. Δοκιμάστε ξανά.");
                System.out.println();
                continue;
            }

            String reply = in.readLine();

            System.out.println(reply);
        }

        out.close();
        os.close();
        in.close();
        is.close();
        input.close();
        dataSocket.close();
    }
}

3 个答案:

答案 0 :(得分:1)

我认为它与源文件的字符编码有关。尝试使用' javac -encoding'进行编译。另外,我认为当你从Eclipse运行时,它会在你运行应用程序并输入你的值时处理字符编码,就像使用cmd一样,当你输入你的值时它会使用你的默认系统编码,这就是为什么有这种不一致;只是一个猜测。

答案 1 :(得分:0)

它与最终char常量有关。只是尝试调试代码,它为DRAW_STR常量返回ASCII值913,这是Java中的字符\u0391(即希腊字母Alpha)。

所以,让我们说,当用户输入' A(150)'时,A有65 ASCII值,而DRAW_STR有913 ASCII值因此,它们不匹配,控制转到default块。它在eclipse中工作的原因可能是eclipse使用的字符集。

我通过删除该字符并再次重新输入来修复它。它似乎可能是因为复制粘贴。但是,如果您想要删除这种可能性,那么您可以使用unicode聊天表示(例如private static final char DRAW_STR = '\u0041';)。 Here是unicode字符表。

答案 2 :(得分:0)

我找到了'解决方案'。我用过System.out.println();打印我在程序中使用的四个希腊常数的数字代码。然后我将这些数字分配给char常量而不是字符,并且它起作用。