I can't figure out why...
package com.codegym.task.task20.task2027;

import java.util.*;

/*
Word search

*/

public class Solution {

    public static List<Word> detectAllWords(int[][] matrix, String... words) {
        List<Word> array = new ArrayList<>();
        for (String word : words) {
            char[] chars = word.toCharArray();
            for (int row = 0; row < matrix.length; row ++) {
                for (int column = 0; column < matrix[0].length; column ++) {
                    if (matrix[row][column] == chars[0]) {
                        detect(matrix, chars, row, column).ifPresent(array::addAll);
                    }
                }
            }
        }
        return array;
    }

    public static Optional<List<Word>> detect(int[][] haystack, char[] needle, int row, int column) {
        List<Word> words = new ArrayList<>();
        String text = String.valueOf(needle);
        int length = needle.length;
        int[] axes = {1, -1};
        for (int axe: axes) {
            boolean rowAxe = true, columnAxe = true;
            boolean[] diagonalAxes = {true, true};
            for (int index = 0; index < length; index ++) {
                int increment = axe * index;
                boolean rowIncrement = row + increment < haystack.length && row + increment + 1 > 0;
                boolean columnIncrement = column + increment < haystack[0].length && column + increment + 1 > 0;
                boolean columnDecrement = column - increment < haystack[0].length && column - increment + 1> 0 ;
                rowAxe =  rowIncrement && rowAxe && (haystack[row + increment][column] == needle[index]);
                columnAxe = columnIncrement && columnAxe && (haystack[row][column + increment] == needle[index]);
                diagonalAxes[0] = (rowIncrement && columnIncrement) &&
                        diagonalAxes[0] && haystack[row + increment][column + increment] == needle[index];
                diagonalAxes[1] = (rowIncrement && columnDecrement) &&
                        diagonalAxes[1] && haystack[row + increment][column - increment] == needle[index];
                if (!rowAxe && !columnAxe && !diagonalAxes[0] && !diagonalAxes[1]) { break; }
            }
            if (rowAxe) words.add(new Word(text, column, row, column, row + axe * (length - 1)));
            if (columnAxe) words.add(new Word(text, column, row, column + axe * (length - 1), row));
            if (diagonalAxes[0]) words.add(
                    new Word(text, column, row, column + axe * (length - 1), row + axe * (length - 1))
            );
            if (diagonalAxes[1]) words.add(
                    new Word(text, column, row, column - axe * (length - 1), row + axe * (length - 1))
            );
        }
        return Optional.of(words);
    }

    public static class Word {
        private String text;
        private int startX;
        private int startY;
        private int endX;
        private int endY;

        public Word(String text) {
            this.text = text;
        }

        public Word(String text, int startX, int startY, int endX, int endY) {
            this(text);
            setStartPoint(startX, startY);
            setEndPoint(endX, endY);
        }

        public void setStartPoint(int i, int j) {
            startX = i;
            startY = j;
        }

        public void setEndPoint(int i, int j) {
            endX = i;
            endY = j;
        }

        @Override
        public String toString() {
            return String.format("%s - (%d, %d) - (%d, %d)", text, startX, startY, endX, endY);
        }
    }
}