проблема инициализации локальной переменной в if-else (Java) - PullRequest
0 голосов
/ 01 апреля 2020

Это мой код.

public class Test {
    public void main (String[] args) {

        int a;
        String b = "11343468/32145";

        String c[] = b.split("");

        for(int i=0; i<c.length; i++) {
            if(c[i].equals("/")) {
                a = i;
            } else {a = 0;}
        }
        System.out.println(a);
    }

Я пытаюсь найти индекс / в String[] c.

Но при печати a затмение говорит Локальная переменная a, возможно, не была инициализирована.

Я знаю, что могу вывести a, если я введу System.out.println(a); в if-else {}, но у меня есть еще работы над этим кодом поэтому я должен использовать код для печати снаружи if-else.

Я использовал else код, но все еще есть ошибка. В чем проблема?

Ответы [ 6 ]

1 голос
/ 01 апреля 2020

Как уже упоминалось в комментариях, анализ компилятора не достаточно go настолько, что он может гарантировать выполнение for-l oop, и поэтому переменная не "определенно назначена", как того требует язык .

Чтобы найти индекс символа в строке, вам не нужны циклы или операторы if. Вы можете просто использовать метод indexOf:

    String b = "11343468/32145";
    int a = b.indexOf('/');
1 голос
/ 01 апреля 2020

Вам нужно инициализировать значение переменной при объявлении в методе. Вы можете найти код ниже, Есть разные способы сделать то же самое. Ниже в одном из них.

public class Test {
    public static void main (String[] args) {

        int a = -1;
        String b = "11343468/32145";

        String c[] = b.split("");

        for(int i=0; i<c.length; i++) {
            if(c[i].equals("/")) {
                a = i;
                break;
            }
        }
        System.out.println(a);
    }
}
0 голосов
/ 02 апреля 2020

Я выберу другой подход. С точки зрения кода org получение индекса должно быть отдельной операцией, которая скорее была бы функцией. Таким образом, ваш код будет

public class Test {
    public static void getIndex (String str, String match) {
        String c[] = str.split("");
        for(int i=0; i<c.length; i++) {
            if(c[i].equals(match)) {
                return i;
            }
        } 
    }
}

Если вам нужен последний индекс, тогда

public class Test {

    public static void getIndex (String str) {
        int index = -1;
        String c[] = str.split("");
        for(int i=0; i<c.length; i++) {
            if(c[i].equals(match)) {
                index = i;
            }
        }
        return index; 
    }
}

И затем используйте то же самое в main

public static void main (String[] args) {
    String b = "11343468/32145";
    System.out.println(getIndex(b, "/"));
}

Также, если вы используется java, тогда у вас есть две функции, доступные в классе String - String::indexOf и String::lastIndexOf. Если вы не хотите его использовать, у вас есть возможность использовать String::toCharArray(). Использование String::split для этой цели крайне не рекомендуется!

Надеюсь, это поможет.

0 голосов
/ 01 апреля 2020

Я предполагаю, что a печатает как 0 в вашем случае, даже если вы инициализируете переменную a. потому что, используя else, вы всегда делаете его 0 в конце. пожалуйста, используйте что-то вроде этого:

    int a = 0;
    String b = "11343468/32145";
    String c[] = b.split("");
    for (int i = 0; i < c.length; i++) {
        if (c[i].equals("/")) {
            a = i;
            break;
        } else {
            a = 0;
        }
    }
    System.out.println("the value is" + a);
0 голосов
/ 01 апреля 2020

@ Комментарий Майкла верен, если вы измените свой код следующим образом, сообщение будет go удалено:

public class Test {
    private static final NOT_FOUND = -1;
    public void main (String[] args) {

        int a = NOT_FOUND;
        String b = "11343468/32145";

        String c[] = b.split("");

        for(int i=0; i<c.length; i++) {
            if(c[i].equals("/")) {
                a = i;
            } else {a = 0;}
        }
        System.out.println((a == NOT_FOUND ? "NOT_FOUND" : a);
    }
}

Константа NOT_FOUND не нужна, но она проясняет, что происходит. Имейте в виду, что продолжение вашего l oop после того, как вы нашли "/", вероятно, перезапишет "найденное" значение a.

0 голосов
/ 01 апреля 2020

Чтобы вы могли печатать a, его необходимо инициализировать. В вашем коде компилятор не знает, что for l oop будет выполнено.

Одним из быстрых способов решения этой проблемы является установка a в ноль с помощью следующего:

Integer a = null; // note we are using the object not the primitive int
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...