2009-07-27 2 views
1

Я знаю, что исключение - это бессмысленно, но я пытался научиться использовать/создавать исключения, поэтому я использовал это. Единственная проблема - по какой-то причине мое сообщение об ошибке, генерируемое моим исключением, дважды печатает на консоли.Java Exception print дважды

импорт java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; импорт java.util.Scanner;

public class Project3 
{ 

    public static void main(String[] args) 
    { 
    try 
    { 
     String inputFileName = null; 
     if (args.length > 0) 
     inputFileName = args[0]; 
     File inputFile = FileGetter.getFile(
      "Please enter the full path of the input file: ", inputFileName); 

     String outputFileName = null; 
     if (args.length > 1) 
     outputFileName = args[1]; 
     File outputFile = FileGetter.getFile(
      "Please enter the full path of the output file: ", outputFileName); 

     Scanner in = new Scanner(inputFile); 
     PrintStream out = new PrintStream(outputFile); 
     Person person = null; 

     // Read records from input file, get an object from the factory, 
     // output the class to the output file. 
     while(in.hasNext()) 
     { 
     String personRecord = in.nextLine(); 

     person = PersonFactory.getPerson(personRecord); 

     person.display(); 

     person.output(out); 
     } 
    } catch (Exception e) 
    { 
     System.err.println(e.getMessage()); 
    } 
    } 

} 





import java.util.Scanner; 

class Student extends Person 
{ 
    private double gpa; 

    public Student() 
    { 
    super(); 
    gpa = 0.0; 
    } 

    public Student(String firstName, String lastName, double gpa) 
    { 
    super(firstName, lastName); 
    this.gpa = gpa; 
    } 

    public String toString(){ 
    try{ 
     if (gpa >= 0.0 && gpa <= 4.0){ 
      return super.toString() + "\n\tGPA: " + gpa; 
     } 
     else { 
      throw new InvalidGpaException(); 
     } 
    } 
    catch (InvalidGpaException e){ 
     System.out.println(e); 
     return super.toString() + "\n\tGPA: " + gpa; 
    } 
    } 

    public void display() 
    { 
    System.out.println("<<Student>>" + this); 
    } 

    @Override 
    public void input(Scanner in) 
    { 
    super.input(in); 

    if (in.hasNextDouble()) 
    { 
     this.gpa = in.nextDouble(); 
    } 
    } 

    class InvalidGpaException extends Exception { 
    public InvalidGpaException() { 
     super("Invalid GPA: " + gpa); 
     } 
    } 
} 

Это моя консольная индикация. Не уверен, что заставляет исключение печатать дважды.

project3.Student$InvalidGpaException: Invalid GPA: -4.0 
<< Student>> 
     Id: 2  Doe, Junior 
     GPA: -4.0 
project3.Student$InvalidGpaException: Invalid GPA: -4.0 

Редактировать: Главный код на верхнем. Ввод - это файл, назначенный пользователем. То, что я показал здесь, это моя распечатка в консоли, а не то, что возвращается в выходной файл. В выходном файле отображается то же самое минус сообщение об ошибке. Сообщение об ошибке из исключения (которое я знаю не обязательно) печатается только на консоли. Я не вижу, где я печатаю его дважды.

+4

Увидеть код, который запускает этот (возможно, ваш метод 'main'), будет наиболее полезным. –

+0

Основной код сейчас. – Tyler

ответ

4

Я думаю, что ваш метод Person.output() имеет вызов toString() в нем, который будет печатать исключение перед возвратом правильной строки, которая не отображается, потому что вы выводите ее на out.

E: Если вы хотите мой вывод, вот оно: первое сообщение об ошибке и нормальное сообщение распечатываются в пределах звонка до display(), как и должно быть. Сразу после этого есть вызов output(), который по имени, я думаю, предназначен для того, чтобы делать то, что делает display(), за исключением файла. Однако вы забыли, что исключение печатается непосредственно на System.out, поэтому оно появляется в консоли, а строка, возвращаемая toString(), записывается в файл.

0

Что вы больше всего цените в новости? каков ваш INPUT. Измените свое исключение на что-то другое.

Где печатать эти данные?

<< Student>> 
     Id: 2  Doe, Junior 
     GPA: -4.0 

Вы уверены, что не вызываете person.toString() дважды?

+0

Эти данные печатаются как на консоли, так и на выходном файле, только на консоль поступают данные об ошибках. – Tyler

0

Я предполагаю, что вы звоните toString где-то в коде, который вы нам пока не показывали.

Ввод в Thread.dumpStack(); в версии toString должен сообщить вам откуда.

0

Попробуйте это изменить:

System.out.println(e); 
    return super.toString() + "\n\tGPA: " + gpa; 

в

System.out.println(e); 

(Или что-то подобное)

+0

Я получаю сообщение об ошибке, если я это сделаю, там должно быть возвращение. – Tyler