Эм…
А как он, например, разделяет случай, когда у уравнения бесконечно много решений и нет решений?
Почему именно такой, а не диагональный или с поиском максимального элемента по модулю?
Ну а про дженерики. У меня где-то валялся обобщенный класс матриц и для него математические штуки… там в любом случае все печально выглядит.
Так же, написанный вами метод, скорее всего, упадет на матрице вида:
1 0 0
0 0 1
0 1 0
Хотя у нее есть одно решение.
Ну и немного по коду…
throws NullPointerException, ArithmeticException
Не делайте так. Обе эти ошибки являются runtime exception и не предназначены для отлова. Если они так нужны в том месте, лучше написать свою или использовать new Exception(«Text»).
Так же в этом случае лучше не делать это через дженерики, потому что у примитивов существует boxing/un-boxing, который достаточно весомый. Куда эффективнее сделать просто для float.
Метод Гаусса на Java