У меня есть строка
String A;
и некоторые методы его обработки
public void setA(String A) throws AInvalidException{
if(isAValid())
this.A = A;
throw new AInvalidException();
}
public boolean isAValid(){
int aLength = getA().length();
return b = (aLength==9) ? true: false;
}
public String getA(){
return A;
}
Когда я пытаюсь увидеть длину моей строки в главном
AClass.setA("123456789");
он говорит, что моя строка недействительна, и после отладки я увидел, что длина моей строки равна нулю. Что, возможно, я ошибаюсь?
Конечно, строка недействительна.
Когда вы создаете новый экземпляр Foo
, A
имеет значение null
. Когда вы вызываете setA
, setA
вызывает isAValid
но этот метод использует текущее значение A
: таким образом, null
.
Вам необходимо параметризовать isValid
:
public class Foo {
private String A;
private boolean b;//??
public boolean isAValid (String a) {
int aLength = a.length();
return b = (aLength==9) ? true: false;//why do you set b?
//proposal: change to
return (alength == 9);//and don't set b
}
public void setA(String A) throws AInvalidException{
if(isAValid(A)) {
this.A = A;
} else {//add else, otherwise you will always throw an exception
throw new AInvalidException();
}
}
//...
}
Кроме того, вам также нужно добавить инструкцию else
, иначе ваш метод setA
всегда будет генерировать исключение.
Наконец, это не значит, что вы используете return b =...
, я полагаю, что b
- это какое-то поле. Прежде всего, большинство программистов согласны с тем, что такой синтаксис очень сбивает с толку, после чего вы изменяете состояние объекта, выполняя проверку, вы лучше разделяете методы на методы (сеттеры) и методы проверки (геттеры и другие)...
Также очень непонятно, почему вы используете (condition)? true: false
(condition)? true: false
. Поскольку условие уже возвращает true
или false
вы можете просто указать: return condition
или в вашем случае return b = condition
.
Во время проверки вы читаете с того места, где вы его установили после проверки
измените его на
if(isAValid(A))
а также
public boolean isAValid(String str){
if(str == null) return false; //it could be null as well
int aLength = str.length();
return b = (aLength==9) ? true: false;
}
примечание: вы должны соблюдать соглашение об именах
if(isAValid))
и throw new AInvalidException();
операторы из setA()
и он возвращает 9. Поэтому я должен проверить валидацию в другой точке моего кода. Thanx!
else
случай для исключения ... В противном случае метод всегда будет генерировать исключение ...
return b = (aLength == 9) ? true : false;
Это какой-то ужасный код