The valid indexes for a String are from 0 through length-1. An index of "length" is off the end of the String. For that reason, when you access word.charAt(max), right after setting max to word.length() it will fail.
Consider word = "cat". Its length = 3, but its characters are at 0 (c), 1 (a), and 2 (t). word.charAt(3) is invalid. Start max out as word.length() - 1 instead of word.length(), and it should work better.
======
Also, I think you want to just "return true" or "return false" rather than tracking a boolean value in rtn. Consider what happens in your code if you are asked to tell whether "dead" is a palindrome.
rtn = false to start with.
Then you compare the first "d" and last "d" and set rtn=true.
Then you compare the second "e" and third "a" ... and return rtn which is true!
But that word is not a palindrome.
As soon as you find ONE character which is mismatched, you can just "return false" right there. If you get through the word and have only found matching characters (you get out of your loop at the bottom) then you can "return true".
J's example code has a similar issue. If asked whether "Abbe" is a palindrome, it will set isPalindrome equal to the LAST pair of characters compared (the two "b" in the middle) and return true, even though it found a mismatched pair ("a" vs "e") previously.
Just remember: as soon as you find ONE mismatched pair of characters, you know the word is not a palindrome, and no further checking is necessary.
@M