длина верной строки возвращает 0

1

У меня есть строка

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");

он говорит, что моя строка недействительна, и после отладки я увидел, что длина моей строки равна нулю. Что, возможно, я ошибаюсь?

  • 2
    Вы пытаетесь проверить старый A, а не новый.
  • 2
    return b = (aLength == 9) ? true : false; Это какой-то ужасный код
Показать ещё 5 комментариев
Теги:
string
string-length

2 ответа

1
Лучший ответ

Конечно, строка недействительна.

Когда вы создаете новый экземпляр 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.

  • 0
    Я вижу вашу точку зрения, я изменяю ее сейчас
  • 0
    хотя я сохраняю логическую переменную, потому что в моих методах есть циклы for, и я решаю проблему возврата таким образом
Показать ещё 5 комментариев
5

Во время проверки вы читаете с того места, где вы его установили после проверки

измените его на

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

примечание: вы должны соблюдать соглашение об именах

  • 0
    Я рекомендовал if(isAValid)) и throw new AInvalidException(); операторы из setA() и он возвращает 9. Поэтому я должен проверить валидацию в другой точке моего кода. Thanx!
  • 0
    вероятно, также необходимо добавить else случай для исключения ... В противном случае метод всегда будет генерировать исключение ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню