Given set of cubes can we get a given word?
Verify complexity to be O(n!), where n is the number of alphabets in the word.

Indeed.
    private CubeFind() {}

You don't need this to get a default constructor.

Premature optimization: read that they were bad practices. they look good in my code, should i keep them ?
If not checked now, then NPE would result after hashMap is computed. on line 46

if (cubeMatrix == null) { throw new NullPointerException(&quot;The input cube matrix should not be null&quot;);

if (word == null {throw new NullPointerException(&quot;The input word should not be null&quot;); }



Please don't do that! You're not gaining anything, the first reason being that it's going to fail very quickly if you really get null or word. The second reason is that there's no reason to get null here, why would that happen? You're simply calling this function from main, it cannot be null. When not for useless optimizations, this practice is called defensive programming and is only useful in a few specific scenarios.
 if (cubeMatrix.length != word.length()) return false;

This one can also be seen as a way to eliminate cases you don't want to reason about later on. That is, you know after this line that you will have the correct number of cubes, and it simplifies the reasoning and the code. You should keep it.
if (cubeNumber == cubeMatrix.length) {

This one wasn't obvious at first, and could deserve a comment, eg. &quot;If we chose a letter for all cubes, check that no letter is left&quot;, maybe.
charFreq.put(cubeMatrix[cubeNumber][i], frequency - 1);
if (findWordExists(cubeMatrix, charFreq, cubeNumber + 1)) {
    return true;
}
charFreq.put(cubeMatrix[cubeNumber][i], frequency);

Nice trick. Another way to do it is to give a copy of cubeMatrix. You would then avoid the second put, but it could be very costly here due to the number of copies you would have to do: don't do it.
I would define premature optimization as &quot;a change made for performance reasons that brings no benefit or degrades readability, and has not been proved to actually improve performance&quot;.
Last, your tests are okay for this usage, but consider using an unit test library like JUnit to manage tests, this will help you later on.