Добрый день.
Во-первых написал свою прогу, забил на сайт и мне посыпались ошибки мол условия не выполнены, пол дня ковырялся и так и не понял где, посмотрел в правильный ответ и заметил там ошибку: for (int i = 0; i < result.length; i++) должна вызывать ArrayIndexOutOfBoundsException, поскольку цикл превышает размер массива, или я не прав ?
Во-вторых ошибка с выводом, долго бился и никак не мог понять в чем дело, текст программы верный, а в итоге получаю следующее на экран:
34
3536
363738
37383940
3839404142
394041424344
40414243444546
4142434445464748
424344454647484950
434445464748494505152
тоже долго возился, перелопатил весь код, и нашёл... System.out.print(result[i][j] + ' ') - в таком виде будет выдавать то что я написал выше, System.out.print(result[i][j] + " ") а в таком уже все нормально, в чём такая принципиальность при использовании апострофов в моём случае ?
олег пасечник
2 уровень
Чертовщина с компилятором ?
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
8 декабря 2020, 07:28
> for (int i = 0; i < result.length; i++) должна вызывать ArrayIndexOutOfBoundsException, поскольку цикл превышает размер массива, или я не прав
Не прав. Этот цикл содержит столько итераций, сколько элементов в массиве result.
> нашёл... System.out.print(result[i][j] + ' ') - в таком виде будет выдавать то что я написал выше, System.out.print(result[i][j] + " ") а в таком уже все нормально
Разница между ' ' и " " только в типе литерала: в апострофах хранится символ char, а в кавычках - литерал типа строка (String). При выводе в консоль и то и другое будет приведено к типу String, поэтому на вывод оно влиять никак не может.
Ты выводишь на экран не те элементы. Предположу, что ты пытаешься перебирать массивы с индексов, равных одному (либо при заполнении, либо при выводе, без кода не знаю). Правильно перебирать с нуля.
0
олег пасечник
8 декабря 2020, 07:58
Не прав. Этот цикл содержит столько итераций, сколько элементов в массиве result.
Спасибо, ошибку нашёл, у меня стоит <= которое дополнительную итерацию и закидывало.
Предположу, что ты пытаешься перебирать массивы с индексов, равных одному (либо при заполнении, либо при выводе, без кода не знаю)
0
hidden #598481
8 декабря 2020, 08:08
А, понял, да.
Поскольку result - это число (int), а тип char может тоже быть преобразован в число, то у тебя выполняется неявное приведение типов.
То есть символу пробела ' ' соответствует число 32, и у тебя сначала выполняется сложение, а потом уже преобразование в строку:
Вот такая цепочка преобразований выполняется перед выводом в консоль.
Таким образом у тебя к каждому числу прибавлялось 32.
Поэтому да, стоило использовать сразу строку вместо char.
+1
ДмитрийЛ
15 января 2021, 20:03
подскажите пожалуйста,
почему "result.length" в строке "for (int i = 0; i < result.length; i++) {" не выдает ошибку ArrayIndexOutOfBoundsException: , а если вставить тоже самое в строку "for (int j = 0; j < result[i].length; j++) {", то выдается эта ошибка.
result.length; и result[i].length; это длины чего?
result.length это количество строк в массиве? а result[i].length; это количество значений в строке?
0