2013-11-18 3 views
-1

Я хочу вернуть объект курса с помощью этого метода, но только если объект не является нулевым.Как избежать отсутствующего оператора возврата в if, если

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

У меня есть «отсутствующий оператор возврата» ошибка, потому что он не может ничего возвращать, но я не хочу ничего возвращать, даже не пустую строку, если объект является недействительным. Я в порядке с изменением метода в пустоте

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(); 
} 

, потому что пустоты типа не допускается.

+2

*, но я не хочу ничего возвращать, даже не пустая строка, если объект является недействительным *, то вы должны убедиться, что ** всегда ** ключ 'class1' переменная инициализируется, и код может быть уменьшен до 'return this.class1'. –

+1

_why_ вы не хотите возвращать что-либо, если объект имеет значение null? –

+3

Язык просто не позволяет делать то, что вы пытаетесь сделать. Я предлагаю вернуть null или другой тип данных, который может выражать различные результаты. –

ответ

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 
    } 
} 
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 положения.
1

Проблема вот что он должен Retrun в class1 является нулевым? Любой объект default/dummy или просто null. Если он не возвращает объект по умолчанию или фиктивный объект, просто удалите это условие, поскольку оно не полезно.

+0

Что вы имеете в виду? –

+0

Метод ожидает возвращения некоторого значения. Любой объект class1 или null. Здесь, если требование ничего не делает в class1 == null, тогда предпочтет удалить это условие if. Если требуется вернуть некоторый объект по умолчанию, например новый Class1(); то если условие является полезным. – BSS

2

Вы должны скорее вернуть null в 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 этого оператора

+0

Конечно, но так вы дважды вызываете getClass1(), что может быть проблемой, если он выполняет некоторые тяжелые вычисления. – PNS

+0

@PNS В этом контексте это всего лишь простой getter для какого-то атрибута. JVM даже изменит вызовы 'getClass1()' на 'this.class1'. –

2

Невозможно сделать.Если ваш метод объявлен для возврата ClassX, вы должны вернуть экземпляр этого класса, один из его подклассов, или null. Клиенту (клиенту) метода должно отвечать за выполнение различной логики на основе возвращаемого значения (или null).

1

Там нет нормального способа не «вернуть ничего» из метода, если:

  1. Метод не имеет тип void возврата. Это не применимо в вашем случае, если вы не используете переменную экземпляра (например, this.class1) и не изменяете эту переменную в методе getClass1() (который возвращает void), но это не хорошая практика программирования, и если вы будете следовать ей, по крайней мере переименовать getClass1() примерно на update()
  2. Метод выбрасывает Exception. Это не имеет особого смысла, поскольку toString() не должен генерировать исключения.

Если 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()); 
} 

, а затем обернуть все методы, которые могут возвращать нулевое значение, в печати(), например,

public String toString() 
{ 
    return super.getName() + "\t" + super.getAge() + "\t" + getStudentNumber() + 
      "\n" + print(getClass1()) + "\n" + print(getClass2()) + "\n" + print(getClass3()); 
} 
Смежные вопросы