一般而言,建議您在解析輸入之前驗證您的輸入,或者測試解析是否有效。
在這種情況下,你正在拆分字符串,這給你沒有把握。
你應該做的是最小的測試,如果你有足夠的塊如預期:
String[] parts = line.split(" ");
if (parts.length >= 5) {
// your usual logic
String user = parts[4];
String pass = parts[5];
}
但它通常是更好地創建一個模式是(嚴格)定義了可接受的輸入。您首先驗證提供的輸入與預期模式相匹配。 (凡在你的方式,你決定要如何寬容是)
something like:
public class TestPattern {
public static String[] inputTest = new String[] {
"!LOGIN user pass",
"!LOGIN user pass ",
"!LOGIN user pass",
"!LOGIN user pass",
" !LOGIN user pass",
" !LOGIN user pass "
};
public static void main(String[] argv) {
//^= start of line
// \\s* = 0 or more spaces
// \\s+ = 1 or more spaces
// (\\w+) = group 1 containing 1 or more word-characters (a-zA-Z etc)
// $ = end of line
Pattern pattern = Pattern.compile("^\\s*!LOGIN\\s+(\\w+)\\s+(\\w+)\\s*$");
for (String input : inputTest) {
Matcher matcher = pattern.matcher(input);
if (!matcher.find()) {
System.out.println("input didn't match login: " + input);
continue;
}
String username = matcher.group(1);
String password = matcher.group(2);
System.out.println("username[ " + username + " ], password[ " + password + " ]");
}
}
}
你可以像壞的輸入也測試:
public static String[] inputFailed = new String[] {
"",
"! LOGIN user pass",
"!LOGINX user pass",
"!LOGIN user pass other",
"!LOGIN userpass"
};
您可以檢查之前,類似的部件[4]和零部件[5 ]不爲空且空白。 – Pratik
使用正則表達式,'\\ s +'而不是'「」'(注意'split'接受正則表達式而不是字符串)。 – Maroun
得到它的工作,謝謝! – user3615887