Как мне получить сразу все ошибки времени компиляции в Java? - PullRequest
0 голосов
/ 02 августа 2020

Я хочу скомпилировать файл java и занести все ошибки в список. Пока я использую встроенный API компилятора java, но у него есть некоторые проблемы.

Например,

//demo.java
class demo
{
    public static void main(String[] args) {
        int array = new int[10]
    }
}

мы видим, что отсутствует точка с запятой и [] (скобки массива) отсутствуют. Но Java API компилятора вернет только

demo.java:4: error: ';' expected
        int array = new int[10]
                               ^
1 error

Но он должен сказать, что отсутствуют [] скобки и точка с запятой ;

Есть ли другой способ компиляции java файл и вернуть все ошибки?

Если есть способ сделать это с помощью Java Compiler API, дайте мне знать.

Если есть какие-либо другие внешние библиотеки или инструмент, который компилирует java файл и вернуть статус ошибки. Внешняя библиотека должна:

  • Если файл не содержит ошибок, тогда библиотека должна сказать, что файл не содержит ошибок.
  • Если в файле Java есть ошибки, библиотека должна вернуть список ошибок с их номером строки и сообщением об ошибке.

Я много искал в этой сети. Но нашел только одно решение, т.е. Java API компилятора. Но я хочу попробовать и другие инструменты.

Ответы [ 2 ]

4 голосов
/ 02 августа 2020

Компилятор Java не предупреждает вас об «отсутствующем []», потому что это не та возможная ошибка, которую компилятор Java может когда-либо выдать; если вы исправите отсутствующую точку с запятой (что является синтаксической ошибкой) в этом коде, то сообщается об ошибке:

incompatible types: int[] cannot be converted to int

, что имеет смысл как ошибка, потому что тип переменной объявлен как int, но выражение инициализатора имеет тип int[].

Описывая ошибку как «отсутствует []», вы делаете ее похожей на другую синтаксическую ошибку, но на самом деле ошибка «несовместимые типы» не является синтаксической ошибкой ; это происходит на этапе проверки типов , который происходит после синтаксического анализа . Однако, если есть какие-либо синтаксические ошибки на этапе синтаксического анализа, компилятор не переходит на этап проверки типов, потому что нет действительного дерева синтаксического анализа для проверки типов.

Таким образом, компилятор Java не будет сообщать как об ошибке синтаксиса, так и об ошибке типа в одном и том же модуле компиляции, независимо от того, используете ли вы инструмент командной строки javac или API компилятора.

2 голосов
/ 02 августа 2020

Это невозможно. Компилятор Java прекращает обработку исходного файла при обнаружении ошибки. Компилятор C / C ++ делает то, что вы хотите, но большинство следующих сообщений об ошибках вводят в заблуждение и бесполезны.

Чтобы получить список всех ошибок, компилятор должен использовать технологии AI. Компилятору нужно будет угадать, что вы имели в виду.

...