Как обрабатывать недопустимые строки данных для нескольких перечислений с использованием настраиваемого исключения в Java? - PullRequest
1 голос
/ 18 июня 2020

Мне нужно обработать недопустимые строки данных при импорте и синтаксическом анализе файла csv в Java. В случае, если моя программа не поддерживает конкретное значение c (например, профессор как профессия), должно быть сгенерировано исключение InvalidCharacteristicException. Моя программа должна обрабатывать такие исключения, выдавая предупреждение и показывая номер строки в файле конфигурации, где была обнаружена ошибка, но я не знаю, как получить общее количество строк моего файла CSV и обработать исключения для данных нескольких типов перечисления . Кроме того, я не совсем уверен, как получить точную строку, в которой произошла ошибка.

Вот, например, enum Profession и enum BodyType.

public enum Profession {
DOCTOR, CEO, CRIMINAL, HOMELESS, UNEMPLOYED , UNKNOWN, NONE;
}

public enum BodyType {
SLIM, OBESE, ATHLETIC, UNSPECIFIED; 
}

Вот как выглядит csv .

  [0],    [1], [2],    [3]  ,    [4]    ,   [5]   ,  [6] ,   [7]  ,  [8] , [9]
class, gender, age, bodyType, profession, pregnant, isYou ,species, isPet, role
scenario:green,   ,         ,           ,         ,        ,      ,      ,
person, female, 24, average ,           , FALSE   ,        ,      ,      , passenger
animal, male  ,  4,         ,           , FALSE   ,        , dog  , TRUE , pedestrian
.
.

Вот что я думаю и что пробовал. Вот мое собственное исключение.

public class InvalidCharacteristicException extends Exception
{   
    public InvalidCharacteristicException() 
    {       
        super("WARNING: invalid characteristic in config file in line" + 
             + Thread.currentThread().getStackTrace()[1].getLineNumber());
    }
}

Ниже приведена часть моего метода readCsv () и мои мысли.

File file = new File(csvFile); 
FileReader fr = new FileReader(file);   
BufferedReader br = new BufferedReader(fr);
String line = "";
String[] tempArr;

for (total rows of the csv file)
{
    if (tempArr[3] is not BodyType.valueOf())
    {

        throw new InvalidCharacteristicException();
    }
    if (tempArr[4] is not Profession.valueOf())
    {
        throw new InvalidCharacteristicException();
    }

}

1 Ответ

1 голос
/ 18 июня 2020

Проблема с вашим подходом заключается в том, что StackTraceElement # getLineNumber возвращает номер строки в вашем коде , который выбрасывает InvalidCharacteristicException (специально названный исходной строкой в ​​документации) вместо номер строки в config , для которого он был брошен. Мы можем решить эту проблему, изменив InvalidCharacteristicException следующим образом:

class InvalidCharacteristicException extends Exception {
    public InvalidCharacteristicException(int configLineNum) {
        super("WARNING: invalid characteristic in config file in line " + configLineNum);
    }
}

Теперь, когда мы передаем номер строки конфигурации, нам как-то нужно отслеживать его в for. Вы не показываете точное for, которое используете, но предполагая, что вы можете отслеживать переменную с именем configLineNum (например, вы можете явно увеличивать configLineNum на 1 каждый раз при обработке строки), вы затем будет использовать

throw new InvalidCharacteristicException(configLineNum);

везде, где вам нужно выбросить исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...