Java异常打印两次

时间:2009-07-27 02:09:30

标签: java exception console printing

我知道异常是没有意义的,但我试图学习如何使用/创建异常,所以我使用了它。唯一的问题是由于某种原因我的异常生成的错误消息是打印到控制台两次。

import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; import 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 个答案:

答案 0 :(得分:4)

我的猜测是你的Person.output()方法在其中调用了toString(),它会在返回正确的字符串之前打印异常,但由于你输出它而没有显示out

E:如果你想要我的扣除,这里是:第一条错误信息和正常信息在display()的呼叫中打印出来,应该如此。紧接着就是output()调用,我猜这个调用的目的是做display()所做的事情,除了文件。但是,您忘记了异常直接打印到System.out,因此它出现在控制台中,而toString()实际返回的字符串将写入文件。

答案 1 :(得分:0)

你的主要内容是什么?什么是你的INPUT .. 将您的例外更改为不同的内容。

你在哪里打印这些数据?

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

你确定你没有两次调用person.toString()吗?

答案 2 :(得分:0)

我的猜测是你在未向我们展示的代码中的某处调用了toString

Thread.dumpStack();实施中加入toString可以告诉您从哪里开始。

答案 3 :(得分:0)

尝试更改此内容:

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

System.out.println(e);

(或类似的东西)