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

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

Вот мои данные перечисления.

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(int configLineNum) 
    {       
        super("WARNING: invalid characteristic in config file in line" + 
             + configLineNum);
    }
}

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

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

try{
    if (BodyType.valueOf().toLowerCase() != tempArr[3]){
        throw new InvalidCharacteristicException();
    }

}catch(InvalidCharacteristicException e){
    InvalidCharacteristicException();
}
try{

    if (Profession.valueOf().toLowerCase() != tempArr[4]){
        throw new InvalidCharacteristicException();
    }
}catch(InvalidCharacteristicException e){
    InvalidCharacteristicException()
}

Вот как я хочу, чтобы этот код изменился. что код выполняет итерацию по всем строкам файла csv и находит номер строки, в которой возникает ошибка исключения ..

for (total rows of the csv file)
{
    if (tempArr[3] != BodyType.valueOf().toLowerCase())
    {

        throw new InvalidCharacteristicException();
    }
    if (tempArr[4] != Profession.valueOf().toLowerCase())
    {
        throw new InvalidCharacteristicException();
    }
}

1 Ответ

0 голосов
/ 18 июня 2020

Хорошо. Итак, я возьму два случая вашего сценария, сначала предполагая, что вы планируете выдать ошибку и остановить выполнение, когда вы столкнулись с неправильным вводом, а в другом случае вы планируете продолжить выполнение, но просто регистрируете предупреждение о неправильном вводе. Оба фрагмента кода приведены ниже:

File file = new File(csvFile); 
FileReader fr = new FileReader(file);   
BufferedReader br = new BufferedReader(fr);
String line = "";
String[] tempArr;
String separator = ",";
int length=0;

    while((line = br.readLine()) != null) {
       tempArr = line.split(separator);
       length = tempArr.length;
       for(int column=0;column < length ; column++) {


            if (column==3 && BodyType.valueOf().toLowerCase() != tempArr[column]){
                    throw new InvalidCharacteristicException(column);
            }else if (column==4 && BodyType.valueOf().toLowerCase() != tempArr[column]){
                throw new InvalidCharacteristicException(column);
            }
        }
    }

Выше один - бросить и остановить выполнение

File file = new File(csvFile); 
FileReader fr = new FileReader(file);   
BufferedReader br = new BufferedReader(fr);
String line = "";
String[] tempArr;
String separator = ",";
int length=0;

    while((line = br.readLine()) != null) {
       tempArr = line.split(separator);
       length = tempArr.length;
       for(int column=0;column < length ; column++) {

         try{
            if (column==3 && BodyType.valueOf().toLowerCase() != tempArr[column]){
                    throw new InvalidCharacteristicException(column);
            }else if (column==4 && BodyType.valueOf().toLowerCase() != tempArr[column]){
                throw new InvalidCharacteristicException(column);
            }
          }catch(InvalidCharacteristicException e){
            //Log error or warn using object e
          }catch(Exception e){
            //Log error or warn using object e
          }
        }
    }   

Этот просто продолжает выполнение. Не забудьте закрыть открытые ресурсы. Я не включил их в код, поскольку основное внимание уделялось циклам записи.

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