private static boolean isWordInWordSearchInner(char[][] wordSearch, String word, int x, int y) {
    if (word.isEmpty()) {
      return true;
    } else {
      boolean firstLetter = matches(wordSearch, x, y, word.charAt(0));
      if (firstLetter) {
        boolean left = isWordInWordSearchInner(wordSearch, word.substring(1), x - 1, y);
        boolean right = isWordInWordSearchInner(wordSearch, word.substring(1), x + 1, y);
        boolean bottom = isWordInWordSearchInner(wordSearch, word.substring(1), x, y + 1);
        boolean top = isWordInWordSearchInner(wordSearch, word.substring(1), x, y - 1);
        boolean topLeft = isWordInWordSearchInner(wordSearch, word.substring(1), x - 1, y - 1);
        boolean topRight = isWordInWordSearchInner(wordSearch, word.substring(1), x + 1, y - 1);
        boolean bottomLeft = isWordInWordSearchInner(wordSearch, word.substring(1), x - 1, y + 1);
        boolean bottomRight = isWordInWordSearchInner(wordSearch, word.substring(1), x + 1, y + 1);

        return left || right || bottom || top || topLeft || topRight || bottomLeft || bottomRight;
      }
      return false;
    }
  }
This could be better if you put every check if the same line with the return because
you are going to check in different directions until you find it instead of check the 8
different possibilities.
src/main/java/com/github/pedrovgs/problem48/WordSearch.java