2012-11-17 67 views
1

我想讀取輸入字符串 - 如果它符合預定義的模式,它應該返回。如果輸入不正確,應拋出異常。使用掃描儀和模式總是拋出異常

這是我到目前爲止。我的問題是,無論輸入它總是拋出一個異常。我在這裏做錯了什麼?

public String readPostCode() throws InputMismatchException 
{ 
    Scanner in = new Scanner(System.in); 
    String postcode; 
    System.out.println("Please enter a Postcode"); 
    postcode = in.next(this.pattern); 
    return postcode; 
} 

當我用上面的方法在try/catch語句,InputMismatchException時總是陷於。

編輯:下面是模式的定義:

public Pattern pattern = Pattern.compile( "[a-zA-Z]" + 
              "([0-9]|[a-zA-Z])" + 
              "(|[0-9]|[0-9][0-9]|[a-zA-Z]|[0-9][a-zA-Z])" + 
              " [0-9][a-zA-Z][a-zA-Z]"); 
+3

哪一行引發異常,什麼是'this.pattern'? – RobEarl

+1

您是否將this.pattern指定爲相應的正則表達式? (例如[A-Z0-9] {3} +?)如果正則表達式未定義,則可能引發InputMismatchException。從它的外觀來看,您在輸入郵編時試圖檢查句法的有效性。嘗試輸入郵政編碼,然後檢查事實後的句法有效性。 如果正則表達式不匹配,則丟棄輸入。 否則,保留它。 – 2012-11-17 19:56:08

+1

@RobEarl可以拋出'InputMismatchException'的唯一行是'postcode = ...'。 –

回答

0

注意:未測試的代碼。

對於加拿大郵政編碼(由於沒有定義的區域設置)

使用:(^ [A-ZA-Z] [0-9] [A-ZA-Z] \ S [0-9? ] [A-ZA-Z] [0-9] $)接受輸入的

實施例:A2B 3P7

public String readPostCode(){ 
     Scanner in = new Scanner(System.in); 
     String postcode = scan.nextLine().toUpperCase(); 
     try { 
      if(postcode.matches("^[A-Z][0-9][A-Z]\s?[0-9][A-Z][0-9]$"){ 
       return postcode; 
      } 
     } catch (InputMismatchException IME){ 
       System.out.println("Input does not match required format"); 
     } 
    } 
0

Scanner默認界定上的空白。讀取包含輸入空格,將其設置爲限定只換行:

in.useDelimiter("\n"); 

你也可以簡化模式頗有幾分。讓它不區分大小寫,並使用{n,m}指定哪些重複至少n,最多m次模式:

Pattern.compile("[A-Z]{1,2}[0-9]{1,3}\\s?[0-9][A-Z]{2}", Pattern.CASE_INSENSITIVE); 

注意這是英國郵政編碼,例如LS1 2AA