如何避免if中缺少return语句

时间:2013-11-18 22:19:09

标签: java if-statement

我希望使用此方法返回Course对象,但前提是该对象不为null。

public Course getClass1()
{
    if(class1 != null)
    {
        return class1;
    }
}

我有一个'缺少返回语句'错误,因为它可能不会返回任何内容,但如果对象为null,我不想返回任何内容,甚至不返回空字符串。我可以将方法更改为无效

public void getClass1()

{
    if(class1 != null)
    {
        System.out.println(class1);
    }
}

但如果我这样做,我就无法调用toString中的方法

public String toString()
{
    return super.getName() + "\t" + super.getAge() + "\t" + getStudentNumber() +
            "\n" + getClass1() + "\n" + getClass2() + "\n" + getClass3();
}

因为不允许使用void类型。

6 个答案:

答案 0 :(得分:7)

您不能有两种不同的返回类型,您的方法必须返回特定类型或不返回任何内容(void)。

这里唯一可行的解​​决方案是让它返回Course,如果没有可用课程,则返回null

public Course getClass1() {
  return class1;
}

public String toString() {
  Course class1 = getClass1();
  boolean class1Available = class1 != null;
  if (class1Available) {
    // something
  else {
    // something else
  }
}

答案 1 :(得分:2)

您将不得不返回Java语言所需的内容。你有几个选择:

  • 返回一个空白的课程对象:

    public Course getClass1() {
        if(class1 != null) {
            return class1;
        }
        return new Course();
    }
    
  • 返回null
    • 这很简单,所以我将跳过代码示例
  • 退出并抛出异常:

    public Course getClass1() {
        if(class1 == null) {
            throw new NullPointerException("class1 is null");
        }
        return class1;
    }
    
    • 未选中NullPointerException,因此没有明确的throws子句。

答案 2 :(得分:2)

如果存在空值,则应该在getClass1中返回null。

如果你不想在toString()中有空值,你可以简单地使用三个参数运算符:

public Course getClass1() {
    return class1;
}

public String toString() {
    return super.getName() + "\t" + super.getAge() + "\t" + getStudentNumber() +
        (getClass1()==null?"":("\n" + getClass1())) + "\n" + getClass2() + "\n" + getClass3();
}

它的工作原理如下:

(condition ? value_if_true : value_if_false)

there's more explanation此运算符

答案 3 :(得分:2)

无法完成。如果声明您的方法返回ClassX,则必须返回该类的实例,其子类之一或null。方法客户端(调用者)应该根据返回的值(或null)执行不同的逻辑。

答案 4 :(得分:1)

这里的问题是它应该在类1中返回的是null吗?任何默认/虚拟对象或Simply null。如果它没有返回默认值或虚拟对象,只需删除这个条件,因为它没用。

答案 5 :(得分:1)

除非:

,否则没有正常的方法可以从方法中“不返回任何内容”
  1. 该方法具有void返回类型。这不适用于您的情况,除非您使用实例变量(例如this.class1)并修改该变量getClass1()方法(返回void),但这不是一个好的编程习惯,如果您遵循它,至少将getClass1()重命名为update()
  2. 该方法会抛出Exception这在这里没有多大意义,因为toString()不应该抛出异常。
  3. 如果主要关注getClass1(),您可以轻松修改toString()方法,如下所示:

    public String toString()
    {
        Course c = getClass1();
    
        return super.getName() + "\t" + super.getAge() + "\t" + getStudentNumber() +
                "\n" + (c==null?"":c) + "\n" + getClass2() + "\n" + getClass3();
    }
    

    要将此行为推广到具有Object返回类型的任何方法,您可以使用简单方法print(),例如

    public String print(Object o)
    {
        return (o==null?"":o.toString());
    }
    

    然后在print()中包装所有可能返回null值的方法,例如

    public String toString()
    {
        return super.getName() + "\t" + super.getAge() + "\t" + getStudentNumber() +
                "\n" + print(getClass1()) + "\n" + print(getClass2()) + "\n" + print(getClass3());
    }