У меня есть метод, похожий на один ниже, где я хочу вернуть только приватную переменную одного класса, и только если некоторые условия будут проверены. В противном случае я хочу выйти из метода без возврата. Я пробовал что-то вроде кода ниже, но я боюсь, что возврат null - это не очень хорошая идея. Есть ли способ выйти из метода, такого как ключевое слово break для циклов?
private Classxpto classxpto;
public Classxpto getclassxpto(String abc, Date asd){
String curr_abc= classxpto.getabc();
Date curr_asd= classxpto.getasd();
if("my conditions"){
//dont return classxpto
return null;
}else if("my other conditions"){
classxpto.setabc(abc);
classxpto.setasd(asd);
return classxpto;
}
return null;
}
Вы можете либо вернуть null (или некоторый экземпляр Classxpto
умолчанию), либо выбросить исключение. Выбрасывание исключения - единственный способ выйти из метода, имеющего невоенный возвращаемый тип, не возвращая ничего.
Exceptions
для управления потоком программ, возникнет много проблем и плохой код. Если вы хотите указать, что значение не будет возвращено, верните ноль. Если вызов этого метода является действительной ошибкой, если условия не выполняются - другими словами, этого никогда не должно произойти, если все работает правильно, - тогда выдается Exception
.
Вы не можете вернуть "ничего" из метода, если он не объявлен как метод void
. (И в этом случае вы можете вернуть только "ничего"!)
Спецификация языка Java говорит об этом в §14.17:
Оператор return с выражением должен содержаться в одном из следующих или возникает ошибка времени компиляции:
- Метод, объявленный для возврата значения
- ...
Если у вас нет значения для возврата, то ваш выбор - либо выбрать какое-то значение, которое означает (для вашего приложения) "нет значения", либо выбросить исключение.
Значение null
часто используется для обозначения "no value", но вы можете использовать другие вещи... в зависимости от объявленного типа возврата.
Выброс исключений был бы плохим, чтобы справиться с этим, если только "нет результата" действительно является исключительным результатом. Использование исключений и обработка исключений для нормального управления потоком считается плохим дизайном на Java и может привести к серьезным проблемам с производительностью.
Теоретически возможно прекратить работу JVM, вызвав System.exit(...)
или написать метод, чтобы он работал вечно или спал навсегда.Однако это, скорее всего, "нежелательное" поведение.
System.exit()
, хотя бы в java был способ пометить метод как noexit
System.exit()
.
Если ваш метод сконструирован таким образом, что параметр возврата является необязательным, вы можете использовать новые необязательные механизмы в Java 8.
Вместо того, чтобы возвращать null, вы возвращаете необязательный.путь().
Для получения дополнительной информации посетите страницу https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html.
Метод либо возвращает ничего (void), либо что-то (включая null
), но может throw
Exception
.
Вы должны думать о том, как клиенты класса будут использовать этот метод. Исключение действительно означает, что случай возврата не должен происходить в нормальных условиях.
Предполагая, что метод находится в классе Foo
:
public class Foo {
private ClassXPto classXPto;
public ClassXPto getClassXPto() {...}
// other Foo stuff
}
В клиентском коде:
null
Foo foo; // initialized somewhere
ClassXPto x = foo.getClassXPto("abc", new Date());
if (x != null) {
// do something with x
}
Foo foo; // initialized somewhere
try {
ClassXPto x = foo.getClassXPto("abc", new Date());
// do something with x
}
catch (WhatEverExceptionYouChoose e) {
// process the exception
}
Foo foo; // initialized somewhere
ClassXPto x = foo.getClassXPto("abc", new Date());
// do something with x. This point will be reached only
// if there is no exception thrown by getClassXPto()
Вы всегда можете выбросить исключение
if(conditionNotMet){
throw new YourCustomException();
}
то обрабатывайте его в любом случае, как вы хотите !!!!
thow
ИНГ исключение не так , как вы должны принять
get
не должныset
значения напрямую, вместо этого используйте механизм событий. Он не должен контролировать,return
или нет. (кроме вопроса безопасности)