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();
}
}
答案 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常量而不是字符,并且它起作用。