如何返回对象列表以及Exception

时间:2015-08-18 09:11:42

标签: java

我的Java程序有一个返回List的方法。它使用各种SQL查询填充列表。在某些情况下,数据可能不存在。在那种情况下,我要抛出异常。由于它是一个列表,列表可能包含有效数据。是否可以获取列表以及捕获例外?

public List<Student> getStudentInfo(){
    //Contains some static info like name, dob of a Student
    List<Student> students = getStudentStaticInfo();
    try{
        for (Student student: students){
            student.setTotalMarks(getStudentMark(student.getId()));
            ...
        }
    catch(FailedToFetchDataException e) {
        throw new Exception("Failed to fetch data");
    } finally {
        return students;
    }

}

在这种情况下,该方法返回有效学生信息列表。但是在例外的情况下,我无法找到答案。

有没有办法处理这两种方法,获取有效信息以及获得特殊情况。

5 个答案:

答案 0 :(得分:6)

一旦抛出Exception,您的方法就会停止,否则它将不得不处理多个异常。你可以这样做。

public List<Student> getStudentInfo(
                     BiConsumer<FailedToFetchDataException, Student> handleError) {
    //Contains some static info like name, dob of a Student
    List<Student> students = getStudentStaticInfo();
    for (Student student: students) {
        try{
            student.setTotalMarks(getStudentMark(student.getId()));
            ...
        } catch(FailedToFetchDataException e) {
            handleError.accept(e, student);
        }
    }
    return students;
}

答案 1 :(得分:3)

您可以让调用者传入List对象:

public void getStudentInfo(List<Student> list){
    ...
}

在方法内部,您使用结果填充列表,如果发生错误,最后会抛出异常。

因此,调用者会收到错误通知,并且仍然返回有效数据。

答案 2 :(得分:1)

您可以创建overrides FailedToFetchDataException的自定义例外,并附加私人字段,例如StudentList<Student>

您可以这样做:

CustomException e = new CustomException(msg);
e.setStudents(list);
throw e;

答案 3 :(得分:1)

执行此操作的一种方法是创建自己的异常,例如:

public class MyException extends Exception {

   private List<Student> list;

   public myException(List<Student> list) {
      this.list = list;
   }

   public List<Student> getList() {
      return list;
   }

   public void setList(List<Student> list) {
      this.list = list;
   }

}

当你抓住Exception

时,抛出此而不是FailedToFetchDataException

但是,当您抓住FailedToFetchDataException

时,最好只返回列表

答案 4 :(得分:0)

如果您仍然可以在异常场景中使用数据,那么您可以将列表传入该方法,即将数据插入到该方法中。例如:

public List<Student> getStudentInfo(List<Student> studentResults){
//Contains some static info like name, dob of a Student
List<Student> students = getStudentStaticInfo();
try{
    for (Student student: students){
        student.setTotalMarks(getStudentMark(student.getId()));
        studentResults.add(student);
        ...
    }
catch(FailedToFetchDataException e) {
    throw new Exception("Failed to fetch data");
} finally {
    return students;
}
}

现在studentResults将填充以下任一项:

  • 如果没有发生异常,所有学生记录
  • 在发生异常之前已经处理的学生记录。

如果您不管setTotalMarks是否提出异常,您都喜欢所有学生记录,也可以在您的致电网站拨打getStudentStaticInfo