Исключение напечатано дважды - PullRequest
0 голосов
/ 28 октября 2010
class Patmatch {
  static String strLine="";

  public static void main(String [] args) {    
    try {
      FileInputStream fstream = new FileInputStream("c://abc.txt");
      DataInputStream in = new DataInputStream(fstream);
      BufferedReader br1 = new BufferedReader(new InputStreamReader(in));           
      while ((strLine = br1.readLine()) != null) {
        try {
          Patternmatch();
        }
        catch(NomatchException me) {
          System.out.println(me.getMessage());
        }
      }
      in.close();
    }
    catch(IOException i) {
      System.out.println("exec:"+i);
    }   
  }

  private static void Patternmatch() throws NomatchException {
    Pattern p = Pattern.compile("---"); 
    Matcher m = p.matcher(strLine);  
    if(m.find()) { 
      System.out.print(m.start()); 
    }
    else { 
      throw new NomatchException("no match"); 
    } 
  }
}

class NomatchException extends Exception {
  NomatchException(String s) {
    super(s);
  }
}

В приведенном выше коде Исключение совпадение не печатается дважды.

У меня есть abc.txt, где у меня нет шаблона ---.

Я могу понять, что в этом main я поймал это исключение, а также в NomatchException() я бросил, но если я удаляю try...catch, это показывает ошибку, и если удаление в nomatchException() ничего не отображается.

Что мне теперь делать, чтобы исправить это?

Ответы [ 3 ]

2 голосов
/ 28 октября 2010

Вы звоните System.out.print() только один раз, но делаете это в цикле while. Возможно, у вас есть дополнительные строки в конце abc.txt, которые заставляют ваш цикл продолжаться.

РЕДАКТИРОВАТЬ в ответ на комментарий:

Что я должен делать, даже если у меня так много строк, исключение должно быть напечатано один раз, но если у меня есть - во многих местах все эти позиции должны быть напечатаны?

Во-первых, обратите внимание, что исключения не должны использоваться для управления потоком вашей программы - обычно они должны возникать только в исключительных обстоятельствах.

Теперь, если вы хотите указать, что нашли не менее 1 несоответствующей строки в abc.txt, то вы можете изменить дизайн вашей программы так, чтобы ваш Patternmatch() вернул boolean результат и на основе этого возвращаемого значения вы можете увеличивать новое поле errorCnt. Если этот новый счетчик больше нуля, вы можете распечатать свое информационное сообщение.

Если, однако, вы хотели бы просто исключить появление ошибки для пустых строк в тексте, вы можете поместить простой метод в свой метод Patternmatch(), чтобы проверить длину строки trim() 'd:

  if (strLine.trim().length() > 0 ) {
      //do your test
  }

Также - заметка о наименовании в Java. Имена классов начинаются с заглавной буквы (поэтому nomatchException должно быть NomatchException), а имена методов начинаются со строчной буквы (Patternmatch() должно быть patternmatch()).

0 голосов
/ 29 октября 2010

В вашем текстовом файле должно быть две строки, которые не совпадают.

Как уже говорили другие, это плохое использование исключений. Пусть метод patternMatch () вернет логическое значение.

0 голосов
/ 28 октября 2010

Я согласен с akf - исключения должны быть исключительными.Другим способом управления вашим логическим потоком может быть:

while (((strLine = br1.readLine()) != null)) {
   if (!Patternmatch())
      System.out.println("no match");
}

и изменение вашего Patternmatch()

private static boolean Patternmatch() throws NomatchException {       
   Pattern p = Pattern.compile("---");        
   Matcher m = p.matcher(strLine);         

   return m.find();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...