2015-04-08 38 views
-1

對於Java IRC客戶端,我有一個登錄功能。如果您輸入「!LOGIN用戶通行證」,它將會登錄您。Java拆分字符串(查看給定的參數)

現在,如果用戶使用空間過多或僅使用1個參數而不是「user」+「pass」,則會導致應用程序崩潰到我分裂線的方式。

我真的有問題找到解決的辦法,所以我可以做一個檢查,如果字符串用戶或字符串傳遞!= NULL ..

任何建議將非常感謝!

if (line.contains("!LOGIN")){ //!LOGIN username password 
    String[] parts = line.split(" "); 
    String user = parts[4]; 
    String pass = parts[5]; 
} 
+0

您可以檢查之前,類似的部件[4]和零部件[5 ]不爲空且空白。 – Pratik

+1

使用正則表達式,'\\ s +'而不是'「」'(注意'split'接受正則表達式而不是字符串)。 – Maroun

+0

得到它的工作,謝謝! – user3615887

回答

1

一般而言,建議您在解析輸入之前驗證您的輸入,或者測試解析是否有效。

在這種情況下,你正在拆分字符串,這給你沒有把握。

你應該做的是最小的測試,如果你有足夠的塊如預期:

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" 
}; 
1
if (line.contains("!LOGIN")){ //!LOGIN username password 
    String[] parts = line.split("\\s+"); 
    String user = parts.length > 3 ? parts[4] : ""; 
    String pass = parts.length > 4 ? parts[5] : ""; 
} 

使用如在上面的註釋中描述的正則表達式,然後檢查該數組的大小。