Ваш фрагмент кода проверяет, появляется ли специальный символ хотя бы один раз.
Простая поправка к этому состояла бы в том, чтобы отменить проверку - то есть найти хотя бы один не специальный символ, который не входит в набор принятых символов:
private final Pattern hasSpecialChar = Pattern.compile("[^!@#$%^&*]");
if (hasSpecialChar.matcher(password).find()) {
return "String allows only !@#$%^&* special characters";
}
Обратите внимание, что в этом ответе предполагается, что вы хотите разрешить только эти специальные символы, а в выводе нет других буквенно-цифровых символов.