Памылка ў маім простым кодзе Java ..!

public class Test {
    public static void main(String... args) {

        int[][] arrayOfInts = {
            {23, 3, 65, 46},
            {65, 55, 2, 3},
            {55, 22, 35, 47}
        };
        int i, j, toFind = 2;

        boolean foundIt = false;

        search:
        for(i = 0; i < arrayOfInts.length; i++) {
            for(j = 0; j < arrayOfInts[i].length; j++) {
                if(arrayOfInts[i][j] == toFind) {
                    foundIt = true;
                    break search;
                }
            }
        }

        if(foundIt) 
            System.out.println("Element found at index " + i + ", " + j);
        else
            System.out.println("Element not found");
    }
}

Паважаны SO, У мяне паўсталі праблемы з кампіляцыяй код вышэй. Мой код працуе выдатна, калі я ініцыялізаваць свой пераменны лік J 0 ( J = 0 ).

Але маё пытанне Чаму я павінен ініцыялізаваць J = 0? Чаму я атрымліваю пераменная J можа не быць ініцыялізаваны памылка ў радку

System.out.println("Element found at index " + i + ", "+ J);

Калі мой Int зменнай я захоўвае значэнне, чаму косяк J крама .. ??

пастскрыптум Noob тут .. !!

3
Для таго, каб пашырыць сваю прысутнасць на іншыя адказы, arrayOfInts.length вылічаецца падчас выканання, а не падчас кампіляцыі. У гэтым вельмі простым выпадку кампілятар можа вызначыць, што, верагодна, arrayOfInts.length не мог быць роўны нулю (мы можам бачыць, што гэта не нуль, проста чытаючы код), але і ў больш агульным выпадку яна не можа. Такім чынам, кампілятар мяркуе, што ўнутраны цыкл ніколі не можа быць выканана.
дададзена аўтар jarmod, крыніца

7 адказы

Прычына заключаецца ў тым, што, наколькі кампілятар занепакоены, arrayOfInts.length <�моцны> можа будзе 0 падчас выканання. Калі гэта адбылося, <�моцны> не ваш цыкл будзе не запускаць - таму J ніколі б не быў ініцыялізаваны ва ўнутраным цыкле.

2
дададзена

Because imagine if you have arrayOfInts.length==0?

Then you never enter the loop --> j not initialized.

Для таго, каб даказаць свой пункт гледжання, паспрабуйце скампіляваць і працуе з

int[][] arrayOfInts = {};
2
дададзена
таму паспрабуйце Int я = 0, у = 0, toFind = 2; або, яшчэ лепш, выкарыстоўваць 3 лініі для гэтага.
дададзена аўтар vikingsteve, крыніца
@vikingsteve як выпраўленне для яго кода так.
дададзена аўтар TecHunter, крыніца

Гэта патрабуе шмат вылічэнняў, каб праверыць, што вы сапраўды пакласці нешта ў J , перш чым выкарыстоўваць яго ў Println заяву.

K, напрыклад, не будзе ініцыялізаваны, калі arrayOfInts быў памер 0 .

Вось чаму вы павінны ініцыялізаваць J , каб дазволіць кампілятара пераканайцеся, што ён ініцыялізуецца, перш чым выкарыстоўваць яго.

1
дададзена

Suppose your outer for loop for(i = 0; i < arrayOfInts.length; i++) { never get chance to executes for some execution instance (as first time i < arrayOfInts.length false when length of array = 0) then j will remain uninitialized. And if foundIt be true, No value for j to print in if block hence error.

1
дададзена

Так як arrayOfInts.length можа будзе 0, ваш цыкл не можа быць выкананы ні разу. У гэтым выпадку пераменная J ніколі не будзе прысвоена значэнне.

1
дададзена

У Java кожная лакальная пераменная павінна быць ініцыялізаваны.

На першай лініі для цыклу пераменнага я раблюся ініцыялізуюцца 0. Але кампілятар не ўпэўнены, што калі другі цыкл будзе нават атрымаць магчымасць выканаць. Выкажам здагадку, што

 arrayOfInts.length is 0. 

У гэтым выпадку значэнне J не будзе ініцыялізаваны.

Добрая рэч, было б праверыць гэта, змяніўшы калі (FoundIt) у выпадку (хлусня), кампіляцыя перастане скардзіцца.

EDIT Its all about, the compiler never assume things. It works on facts available and the fact there says the following: 1) i will always have a value. 2 j might not get a value and remain uninitialized. 3) foundIt can be true. :)

Акрамя таго, яго сапраўды добрая практыка, каб ініцыялізаваць зменныя перад іх выкарыстаннем.

Пераменны ўзровень класа аўтаматычна ініцыялізуюцца значэнні па змаўчанні ў момант ініцыялізацыі класа. Але метад лакальных зменных не з'яўляюцца, такім чынам, скардзяцца/кампіляцыі памылкі часу.

1
дададзена

Таму што гэта не ўлічваючы, што ваш ўнутраны цыкл, які ініцыялізуе J будзе выконвацца. Майце на ўвазе, што выкананне цыкла з'яўляецца ўмоўным, так што ўмовы на вашым знешнім контуры (тая, I) не можа быць праўдай. У гэтым выпадку лінія, якая ініцыялізуе J ніколі не будзе выконвацца.

1
дададзена