Скажите, есть ли у меня код ниже, он в основном решает, что некоторое условие подобрано, и затем присвойте булево значение, затем выполните некоторые коды. Затем выдайте исключение, если booleanValue является ложью. Что, если я хочу, чтобы это сразу выдало исключение, если booleanValue является ложью без рабочей остальной части кодов? Если я просто поместил второй условный оператор в первый, там будет дублирован коды. Покажите мне умный способ сделать это (я изменил код, на который будут походить мои фактические коды).
boolean booleanValue = false;
Permission value;
if (someCondition) {
value = getPermission_1();
booleanValue = someMethod(value);
useValue_1(value);
}
else {
value = getPermission_2();
booleanValue = anotherMethod(value);
useValue_2(value);
}
if (!booleanValue) {
throw Exception();
}
Как насчет исключения логической переменной? Вы можете переписать свой код следующим образом:
if (someCondition) {
if (!someMethod()) {
throw new Exception();
}
some codes...
}
else {
if (!anotherMethod()) {
throw new Exception();
}
some codes...
}
На мой взгляд, это проще, но такие вещи - дело вкуса ...
Дополнительное преимущество: если исключение попадает в трассировку стека, вы знаете, что за условие было потому, что у вас есть два разных оператора throw. Это может немного ускорить отладку.
Очевидное решение:
boolean booleanValue = false;
if (someCondition) {
booleanValue = someMethod();
if(booleanValue){
//some codes...
}
}
else {
booleanValue = anotherMethod();
some codes...
}
if (!booleanValue) {
throw Exception();
}
... но я не против повторить бит if (! BooleanValue) throw Exception ();
, потому что это вероятно концептуально другая причина, по которой вы выбрасываете исключение. (Например, вы можете указать более подробное сообщение об ошибке в своем исключении.)
Вместо
booleanValue = anotherMethod();
вы должны просто написать
if( !someMethod() )
throw new SomeException();
При генерировании общего исключения - не делайте этого. Причина, по которой вы генерируете исключение, состоит в том, чтобы сообщить вызывающей стороне, что произошло что-то исключительное. Почти всегда полезно сообщить им, что, иначе ни вызывающий абонент, ни вы ничего не сможете с этим поделать.
Возможно, все это очень субъективно?
boolean booleanValue = aBoolean;
if (someCondition) {
if (!someMethod()) {
throw new SomeException();
}
some codes...
} else {
if (!anotherMethod()) {
throw new AnotherException();
}
some other codes...
}
Лучшим решением будет ...
if (someCondition) {
value = getPermission_1();
if (!someMethod(value)) {
throw new SomeException();
}
useValue_1(value);
}
else {
value = getPermission_2();
if (!anotherMethod(value)) {
throw new AnotherException();
}
useValue_2(value);
}
И вы не должны смотреть на это как на дублирующий код, потому что если вы хотите сгенерировать исключение, то можно ожидать, что причина исключение будет различным в каждом случае, и поэтому в каждом случае следует передавать другое исключение или другое сообщение.
Я предполагаю, что вы хотите знать, какое условие было выполнено, а затем не выполнено, потому что все, что вы получаете обратно, - это логическое значение от вашего ... Метод вызывает причину сбоя, вероятно, не будет очевидной в этом сценарии .
Это вроде как пахнет ... как в "запахе кода". Возвращаемое значение переводится в исключение. Кажется, что если вызывающий написал someMethod и anotherMethod, тогда решение состоит в том, чтобы переписать эти методы и выбросить исключение из этих методов вместо использования возвращаемого значения. Но это только в том случае, если программист имеет доступ к коду. Если это вызов стороннего API, я полагаю, что перевод должен произойти.
Предполагая, что два некоторых кода ...
различны, вы, вероятно, захотите сделать:
boolean booleanValue = someCondition ? someMethod() : anotherMethod();
if(!booleanValue) {
throw new Exception();
}
if(someCondition) {
// some code
} else {
// some code
}
Если они одинаковые, то if (someCondition)
не требуется
Если (гипотетически) у вас есть инструмент статического анализа, который не допускает троичных выражений, вы можете заменить первые строки на:
boolean booleanValue;
if(someCondition) {
booleanValue = someMethod();
} else {
booleanValue = anotherMethod();
}