2017-05-31 2 views
0

ich ein Programm gemacht, das zu lesen und zu speichern Strings angenommen hat und mit ihnen später noch mehr Dinge zu tun, hier ist ein Beispiel string:Wie eine Ausnahme zu machen, basierend auf den Charakter gefunden

AAAAAAAAABBBBBBCCCC 
BBBBBBBAAAAACCCCCCC 

Ich möchte Machen Sie eine Ausnahme in der Scanner-Methode, so dass, wenn ich es lese und es unerwünschte Zeichen wie '_' und '!' oder 'f' gibt eine Ausnahme zurück und stoppt den Rest des Programms.

Grundsätzlich möchte ich es nur 3 Zeichen (A, B und C) erlauben. Ich habe keine Ahnung, atm wie man das schreibt, aber es gibt wahrscheinlich eine Java-Methode, wie man das macht: D

Also wie schreibe ich eine Ausnahme, die nur diese 3 erlaubt?

Ich weiß, dass sieht schrecklich aus, aber ja, das ist im Grunde, was ich schreibe. Vielen Dank.

+0

Warum nicht suchen, wie überprüft werden kann, ob die Datei noch etwas enthält? – ItamarG3

+1

Schlüsselwörter: Java String Regex Match – CSK

+0

Wenn Sie wirklich jede Zeile überprüfen müssen, warum verwenden Sie nicht eine Regex (schauen Sie sich 'String.matches()' an) oder überprüfen Sie jedes Zeichen einzeln? – Thomas

Antwort

1

Verwendung Regex

String s = "AAAAAAAAABBBBBBCCCC"; 
if(s.replaceAll("[ABC]", "").length()>0){ 
    //incorrect 
}else{ 
    //correct 
} 

Es entfernt alle A, B und C, und dann überprüft, ob die Länge größer als 0

ist

Oder

if(s.matches("[ABC]+")){ 
    //correct 
}else{ 
    //incorrect 
} 

Beachten Sie, dass es Fall ist empfindlich. Auch, wenn die Länge des String 0 ist, würde es geben falsche

+4

' replaceAll() 'ist wahrscheinlich ziemlich ineffizient, verwende besser' matches() [ABC] + ")". – Thomas

+0

Hmm, wenn Sie sich die Implementierung von 'Matcher.replaceAll()' (wo 'String.replaceAll()' zu führt) ansehen, sehen Sie, dass ziemlich viel Code beim Ersetzen involviert ist, obwohl es wahrscheinlich vernachlässigbar ist für kurze Saiten kann es für größere Saiten oder eine große Anzahl von Saiten ziemlich bedeutsam werden. – Thomas

+0

* "Keine Notwendigkeit, Scanner zu verwenden" * Nun, OP muss * etwas * aus der Datei lesen. Regex kann Dateien nicht lesen, daher ist diese Anweisung falsch. – Andreas

0

Sie können Regex verwenden zu finden, wenn die Datei nur Ihre angegebenen Zeichen enthält, würde es so aussehen:

Scanner s = new Scanner(new File("C:/path/hehe.txt")); 
Pattern p = Pattern.compile("[ABC]+"); 
while (s.hasNextLine()) { 
    if (!p.matcher(s.nextLine()).find()) { 
     break; 
    } 
} 
0

Sie wickeln könnte Ihre Datei in einem Readable die ungültige Zeichen ablehnt: kann

public class ValidatingReadable implements Readable { 

     private Reader wrappedReadable; 

     public ValidatingReadable(Readable wrappedReadable) { 
      this.wrappedReadable = wrappedReadable; 
     } 

     public int read(CharBuffer cb) throws IOException { 
      int r = wrappedReadable.read(cb); 
      for(int i=0; i<r; i++) { 
       char c = cb.get(i); 
       if(c < 'A' || c > 'C') { 
        throw new IOException("Invalid input:" + c); 
       } 
      } 
      return r; 
     } 

Sie verwenden diese überall ein Readable akzeptiert wird, zum Beispiel:

Scanner scanner = new Scanner(
    new ValidatingReader(
     new FileReader("C:/path/hehe.txt"))); 

Dies ist ein Beispiel für das Decorator Pattern.

Verwandte Themen