2013-05-01 2 views
1

Как я могу захватить system.err и отобразить сообщение пользователю, а не отображать окно терминала?Java: Capture System.err

Класс, содержащий строку, НЕ допускается изменять. Heres код:

Вступление Класс:

public Entry(String paramString1, String paramString2, String paramString3, String paramString4, String paramString5) 
    { 
    this.firstName = paramString1; 
    this.lastName = paramString2; 
    this.street = paramString3; 
    this.town = paramString4; 
    if (paramString5.matches("[A-Z]{2}[0-9]{1,2} [0-9]{1,2}[A-Z]{2}")) { 
     this.postCode = paramString5; 
    } else { 
     System.err.printf("Bad postcode: '%s'\n", new Object[] { paramString5 }); 
     this.postCode = "???"; 
    } 
    } 

AddressBook Класс:

public String add(Entry paramEntry) 
    { 
    if (paramEntry == null) 
     return "Error: null entry"; 
    if (this.data.contains(paramEntry)) { 
     return "Error: this entry already in the book"; 
    } 
    boolean bool = this.data.add(paramEntry); 
    if (bool) { 
     return " entry added"; 
    } 
    return "entry could not be added"; 
    } 

расширенного класса запись:

public class Personal extends Entry 
{ 
    private String dob; 

    public Personal(String firstName, String lastName, String street, String town, String postcode, String theDOB) 
    { 
     super(firstName, lastName, street, town, postcode); 
     dob = theDOB; 
    } 

Текущий вызов, чтобы добавить запись из класса GUI:

entry = Personal(firstName, lastName, street, town, postcode.toUpperCase(), dob); 
message = addressbook.add(entry); 

Если я вхожу в плохой почтовый индекс, в настоящее время я получаю окно терминала с надписью «Bad poscode:», после чего создается запись с ??? как почтовый индекс. Я хочу, чтобы пользователь мог запросить другой ввод без добавления записи. Я не знаю, как это сделать, но без изменения класса Entry (не разрешено изменять классы Entry или AddressBook).

+0

* «НЕ разрешено изменять» * Говорит кто? –

+0

@AndrewThompson классы были предоставлены преподавателем, и вам не разрешили каким-либо образом их модифицировать – ToniHopkins

+1

Надеюсь, это всего лишь тестовое приложение. Обработка ошибок таким образом, вероятно, является самым худшим решением, которое я видел до сих пор ... – home

ответ

2

Вы можете использовать

public static void main(String... ignored) { 
    System.setErr(new PrintStream(new OutputStream() { 
     private StringBuilder line = new StringBuilder(); 

     @Override 
     public void write(int b) throws IOException { 
      if (b == '\n') { 
       String s = line.toString(); 
       line.setLength(0); 
       // TODO fill in what you want to do 
       System.out.println("ERR " + s + " ERR"); 
      } else if (b != '\r') { 
       line.append((char) b); 
      } 
     } 
    })); 

    System.err.println("Hello World"); 
    new Throwable("HERE").printStackTrace(); 
} 

отпечатки

ERR Hello World ERR 
ERR java.lang.Throwable: HERE ERR 
ERR  at Main.main(Main.java:24) ERR 
0

Почему бы не сделать все проверки проверки на Personal самого класса при создании этого объекта в первую очередь? Убедитесь, что созданы только те объекты, которые имеют действительные данные. Решает вашу проблему.

Я бы сказал, сделайте эти проверки и покажите ему все ошибки в вашем классе.

+0

ГЭС, желая, чтобы мы использовали обработку ошибок для обработки всей проверки (в настоящее время у меня есть IF, проверяющие входные данные перед передачей команды add). Итак, я понял, что hes получил, что проверка в классе ввода hes хочет, чтобы мы каким-то образом использовали его. Не нравится, как ГЭС учит нас плохой практике. – ToniHopkins

+0

oh почему вы ** предполагаете **, что я не понимаю. Если вы обрабатываете всю проверку данных перед созданием этого объекта на первом месте, которое будет делать для вас. – LPD

Смежные вопросы