2012-11-17 1 views
1

J'essaie de lire une chaîne d'entrée - si elle est conforme à un modèle prédéfini, elle doit être renvoyée. Si l'entrée n'est pas correcte, une exception doit être levée.L'utilisation de Scanner et de Patterns génère toujours une exception

Voici ce que j'ai jusqu'ici. Mon problème est que, quelle que soit l'entrée, elle génère toujours une exception. Que pourrais-je faire mal ici?

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; 
} 

Lorsque j'utilise la méthode ci-dessus dans une instruction try/catch, un InputMismatchException est toujours pris.

EDIT: Voici la définition du modèle:

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

Quelle ligne lance l'exception et qu'est-ce que 'this.pattern'? – RobEarl

+1

Avez-vous spécifié this.pattern comme une regex correspondante? (par exemple, [A-Z0-9] {3} +?) Si l'expression regex n'est pas définie, il se peut que ce soit l'entrée InputMismatchException. D'après son apparence, vous essayez de vérifier la validité syntaxique lorsque vous entrez le code postal. Essayez d'entrer le code postal, puis vérifiez la validité syntaxique après le fait. Si le Regex ne correspond pas, ignorez l'entrée. Sinon, conservez-le. –

+1

@RobEarl La seule ligne qui pourrait lancer 'InputMismatchException' est' code postal = ... '. –

Répondre

0

Remarque: code non testé.

Pour un code postal canadien (puisque locale n'a pas été défini)

Utilisation de: (^ [a-zA-Z] [0-9] [a-zA-Z] \ s [0-9? ] [a-zA-Z] [0-9] $)

Exemple d'entrée accepté: 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 délimite sur les espaces par défaut. Pour lire des espaces contenant d'entrée, réglez-le sur les nouvelles lignes seulement délimiter:

in.useDelimiter("\n"); 

Vous pouvez également simplifier le modèle un peu. Faites-insensible à la casse et utiliser {n,m} pour spécifier un motif qui se répète au moins n et au plus m fois:

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

Remarque c'est un code postal britannique, par exemple LS1 2AA.

Questions connexes