From 97a4f3de3d28586a2145b3cd3d609c634ab43c9c Mon Sep 17 00:00:00 2001
From: Jonathan Pereira <jonpereiradev@gmail.com>
Date: Mon, 15 Apr 2019 14:34:31 -0300
Subject: [PATCH] Fix rules and getArray column value implementation.

---
 pom.xml                                       |   2 +-
 .../jfile/reader/file/JFileColumn.java        | 215 +++++++++++++++---
 .../rule/column/BigDecimalTypeRule.java       |   6 +-
 .../rule/column/BigIntegerTypeRule.java       |   6 +-
 .../jfile/reader/rule/column/CnpjRule.java    |  18 +-
 .../reader/rule/column/DateAfterRule.java     |   5 +
 .../reader/rule/column/DateBeforeRule.java    |   5 +
 .../rule/column/DateFutureOrPresentRule.java  |   5 +
 .../reader/rule/column/DateFutureRule.java    |  13 +-
 .../rule/column/DatePastOrPresentRule.java    |   5 +
 .../reader/rule/column/DatePastRule.java      |  13 +-
 .../rule/column/DomainCharacterRule.java      |   5 +
 .../reader/rule/column/DomainIntegerRule.java |   5 +
 .../reader/rule/column/DomainLongRule.java    |   5 +
 .../reader/rule/column/DomainShortRule.java   |   5 +
 .../reader/rule/column/DoubleTypeRule.java    |   6 +-
 .../reader/rule/column/FloatTypeRule.java     |   6 +-
 .../reader/rule/column/IntegerTypeRule.java   |   6 +-
 .../rule/column/LocalDateAfterRule.java       |   2 +-
 .../rule/column/LocalDateBeforeRule.java      |   2 +-
 .../column/LocalDateFutureOrPresentRule.java  |   2 +-
 .../rule/column/LocalDateFutureRule.java      |   2 +-
 .../column/LocalDatePastOrPresentRule.java    |   2 +-
 .../reader/rule/column/LocalDatePastRule.java |   2 +-
 .../rule/column/LocalDateTimeAfterRule.java   |   2 +-
 .../rule/column/LocalDateTimeBeforeRule.java  |   2 +-
 .../LocalDateTimeFutureOrPresentRule.java     |   2 +-
 .../rule/column/LocalDateTimeFutureRule.java  |   2 +-
 .../LocalDateTimePastOrPresentRule.java       |   2 +-
 .../rule/column/LocalDateTimePastRule.java    |  15 +-
 .../reader/rule/column/MaxBigDecimalRule.java |   5 +
 .../reader/rule/column/MaxBigIntegerRule.java |   5 +
 .../reader/rule/column/MaxDoubleRule.java     |   5 +
 .../reader/rule/column/MaxFloatRule.java      |   5 +
 .../reader/rule/column/MaxIntegerRule.java    |   5 +
 .../jfile/reader/rule/column/MaxLongRule.java |   5 +
 .../reader/rule/column/MaxShortRule.java      |   5 +
 .../reader/rule/column/MinBigDecimalRule.java |   5 +
 .../reader/rule/column/MinBigIntegerRule.java |   5 +
 .../reader/rule/column/MinDoubleRule.java     |   5 +
 .../reader/rule/column/MinFloatRule.java      |   5 +
 .../reader/rule/column/MinIntegerRule.java    |   5 +
 .../jfile/reader/rule/column/MinLongRule.java |   5 +
 .../reader/rule/column/MinShortRule.java      |   5 +
 44 files changed, 355 insertions(+), 83 deletions(-)

diff --git a/pom.xml b/pom.xml
index 80aa036..60657b6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.github.jonpereiradev</groupId>
   <artifactId>jfile-reader</artifactId>
-  <version>0.5.0</version>
+  <version>0.6.0</version>
   <packaging>jar</packaging>
   <name>${project.groupId}:${project.artifactId}</name>
   <description>API for read and parse a file into an object</description>
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/file/JFileColumn.java b/src/main/java/com/jonpereiradev/jfile/reader/file/JFileColumn.java
index 4e0b912..77992ae 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/file/JFileColumn.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/file/JFileColumn.java
@@ -12,14 +12,18 @@
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.function.Function;
+import java.util.regex.Pattern;
 
 public class JFileColumn implements Comparable<JFileColumn> {
 
+    private static final Pattern DEFAULT_ARRAY_SEPARATOR = Pattern.compile(",\\s*");
     private static final ConcurrentMap<Class<?>, Function<JFileColumn, ?>> MAPPER = new ConcurrentHashMap<>();
 
     static {
@@ -56,24 +60,6 @@ public JFileColumn(JFileReaderContext context, int position, String content) {
         this.content = content;
     }
 
-    @Override
-    public int compareTo(JFileColumn o) {
-        return Integer.compare(position, o.position);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        JFileColumn that = (JFileColumn) o;
-        return position == that.position;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(position);
-    }
-
     public int getPosition() {
         return position;
     }
@@ -87,6 +73,14 @@ public String getText() {
         return content;
     }
 
+    public String[] getTextArray() {
+        return getTextArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public String[] getTextArray(Pattern pattern) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(JFileColumn::getText).toArray(String[]::new));
+    }
+
     public Character getCharacter() {
         if (StringUtils.isBlank(content) || content.length() > 1) {
             return null;
@@ -95,12 +89,32 @@ public Character getCharacter() {
         return content.charAt(0);
     }
 
+    public Character[] getCharacterArray() {
+        return getCharacterArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public Character[] getCharacterArray(Pattern pattern) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(JFileColumn::getCharacter).toArray(Character[]::new));
+    }
+
     public Short getShort() {
         if (StringUtils.isBlank(content)) {
             return null;
         }
 
-        return Short.valueOf(content);
+        try {
+            return Short.valueOf(content);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
+    public Short[] getShortArray() {
+        return getShortArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public Short[] getShortArray(Pattern pattern) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(JFileColumn::getShort).toArray(Short[]::new));
     }
 
     public Integer getInt() {
@@ -108,7 +122,19 @@ public Integer getInt() {
             return null;
         }
 
-        return Integer.valueOf(content);
+        try {
+            return Integer.valueOf(content);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
+    public Integer[] getIntArray() {
+        return getIntArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public Integer[] getIntArray(Pattern pattern) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(JFileColumn::getInt).toArray(Integer[]::new));
     }
 
     public Long getLong() {
@@ -116,7 +142,19 @@ public Long getLong() {
             return null;
         }
 
-        return Long.valueOf(content);
+        try {
+            return Long.valueOf(content);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
+    public Long[] getLongArray() {
+        return getLongArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public Long[] getLongArray(Pattern pattern) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(JFileColumn::getLong).toArray(Long[]::new));
     }
 
     public Float getFloat() {
@@ -124,7 +162,19 @@ public Float getFloat() {
             return null;
         }
 
-        return Float.valueOf(content);
+        try {
+            return Float.valueOf(content);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
+    public Float[] getFloatArray() {
+        return getFloatArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public Float[] getFloatArray(Pattern pattern) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(JFileColumn::getFloat).toArray(Float[]::new));
     }
 
     public Double getDouble() {
@@ -132,7 +182,19 @@ public Double getDouble() {
             return null;
         }
 
-        return Double.valueOf(content);
+        try {
+            return Double.valueOf(content);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
+    public Double[] getDoubleArray() {
+        return getDoubleArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public Double[] getDoubleArray(Pattern pattern) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(JFileColumn::getDouble).toArray(Double[]::new));
     }
 
     public Boolean getBoolean() {
@@ -151,12 +213,32 @@ public Boolean getBoolean() {
         return BooleanUtils.toBooleanObject(booleanString);
     }
 
+    public Boolean[] getBooleanArray() {
+        return getBooleanArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public Boolean[] getBooleanArray(Pattern pattern) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(JFileColumn::getBoolean).toArray(Boolean[]::new));
+    }
+
     public BigInteger getBigInteger() {
         if (StringUtils.isBlank(content)) {
             return null;
         }
 
-        return new BigInteger(content);
+        try {
+            return new BigInteger(content);
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
+
+    public BigInteger[] getBigIntegerArray() {
+        return getBigIntegerArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public BigInteger[] getBigIntegerArray(Pattern pattern) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(JFileColumn::getBigInteger).toArray(BigInteger[]::new));
     }
 
     public BigDecimal getBigDecimal() {
@@ -171,10 +253,22 @@ public BigDecimal getBigDecimal(DecimalFormat bigDecimalFormatter) {
         try {
             return (BigDecimal) bigDecimalFormatter.parse(content);
         } catch (ParseException e) {
-            throw new NumberFormatException(e.getMessage());
+            return null;
         }
     }
 
+    public BigDecimal[] getBigDecimalArray() {
+        return getBigDecimalArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public BigDecimal[] getBigDecimalArray(Pattern pattern) {
+        return getBigDecimalArray(pattern, context.getBigDecimalFormatter());
+    }
+
+    public BigDecimal[] getBigDecimalArray(Pattern pattern, DecimalFormat bigDecimalFormatter) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(o -> o.getBigDecimal(bigDecimalFormatter)).toArray(BigDecimal[]::new));
+    }
+
     public Date getDate() {
         return getDate(context.getDateFormat());
     }
@@ -191,6 +285,18 @@ public Date getDate(DateFormat pattern) {
         }
     }
 
+    public Date[] getDateArray() {
+        return getDateArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public Date[] getDateArray(Pattern pattern) {
+        return getDateArray(pattern, context.getDateFormat());
+    }
+
+    public Date[] getDateArray(Pattern pattern, DateFormat dateFormat) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(o -> o.getDate(dateFormat)).toArray(Date[]::new));
+    }
+
     public LocalDate getLocalDate() {
         return getLocalDate(context.getLocalDateFormatter());
     }
@@ -200,7 +306,23 @@ public LocalDate getLocalDate(DateTimeFormatter dateTimeFormatter) {
             return null;
         }
 
-        return LocalDate.parse(content, dateTimeFormatter);
+        try {
+            return LocalDate.parse(content, dateTimeFormatter);
+        } catch (DateTimeParseException e) {
+            return null;
+        }
+    }
+
+    public LocalDate[] getLocalDateArray() {
+        return getLocalDateArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public LocalDate[] getLocalDateArray(Pattern pattern) {
+        return getLocalDateArray(pattern, context.getLocalDateFormatter());
+    }
+
+    public LocalDate[] getLocalDateArray(Pattern pattern, DateTimeFormatter dateTimeFormatter) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(o -> o.getLocalDate(dateTimeFormatter)).toArray(LocalDate[]::new));
     }
 
     public LocalDateTime getLocalDateTime() {
@@ -212,10 +334,49 @@ public LocalDateTime getLocalDateTime(DateTimeFormatter dateTimeFormatter) {
             return null;
         }
 
-        return LocalDateTime.parse(content, dateTimeFormatter);
+        try {
+            return LocalDateTime.parse(content, dateTimeFormatter);
+        } catch (DateTimeParseException e) {
+            return null;
+        }
+    }
+
+    public LocalDateTime[] getLocalDateTimeArray() {
+        return getLocalDateTimeArray(DEFAULT_ARRAY_SEPARATOR);
+    }
+
+    public LocalDateTime[] getLocalDateTimeArray(Pattern pattern) {
+        return getLocalDateTimeArray(pattern, context.getLocalDateTimeFormatter());
+    }
+
+    public LocalDateTime[] getLocalDateTimeArray(Pattern pattern, DateTimeFormatter dateTimeFormatter) {
+        return getArrayOf(pattern, array -> Arrays.stream(array).map(o -> o.getLocalDateTime(dateTimeFormatter)).toArray(LocalDateTime[]::new));
+    }
+
+    private <T> T[] getArrayOf(Pattern pattern, Function<JFileColumn[], T[]> function) {
+        String[] split = pattern.split(content);
+        return function.apply(Arrays.stream(split).map(s -> new JFileColumn(context, position, s)).toArray(JFileColumn[]::new));
     }
 
     public JFileReaderContext getContext() {
         return context;
     }
+
+    @Override
+    public int compareTo(JFileColumn o) {
+        return Integer.compare(position, o.position);
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        JFileColumn that = (JFileColumn) o;
+        return position == that.position;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(position);
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/BigDecimalTypeRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/BigDecimalTypeRule.java
index 27b05fc..8baf06d 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/BigDecimalTypeRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/BigDecimalTypeRule.java
@@ -15,11 +15,7 @@ public BigDecimalTypeRule(int position, DecimalFormat decimalFormat) {
 
     @Override
     public boolean isValid(JFileColumn fileColumn) {
-        try {
-            return fileColumn.getText().isEmpty() || fileColumn.getBigDecimal(decimalFormat) != null;
-        } catch (NumberFormatException e) {
-            return false;
-        }
+        return fileColumn.getText().isEmpty() || fileColumn.getBigDecimal(decimalFormat) != null;
     }
 
     @Override
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/BigIntegerTypeRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/BigIntegerTypeRule.java
index 85b1152..aa760db 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/BigIntegerTypeRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/BigIntegerTypeRule.java
@@ -10,11 +10,7 @@ public BigIntegerTypeRule(int position) {
 
     @Override
     public boolean isValid(JFileColumn fileColumn) {
-        try {
-            return fileColumn.getText().isEmpty() || fileColumn.getBigInteger() != null;
-        } catch (NumberFormatException e) {
-            return false;
-        }
+        return fileColumn.getText().isEmpty() || fileColumn.getBigInteger() != null;
     }
 
     @Override
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/CnpjRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/CnpjRule.java
index a6971fc..9fce975 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/CnpjRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/CnpjRule.java
@@ -2,8 +2,24 @@
 
 import com.jonpereiradev.jfile.reader.file.JFileColumn;
 
+import java.util.Arrays;
+import java.util.List;
+
 public class CnpjRule extends AbstractColumnRule {
 
+    private static final List<String> INVALID_CNPJS = Arrays.asList(
+        "00000000000000",
+        "11111111111111",
+        "22222222222222",
+        "33333333333333",
+        "44444444444444",
+        "55555555555555",
+        "66666666666666",
+        "77777777777777",
+        "88888888888888",
+        "99999999999999"
+    );
+
     public CnpjRule(int position) {
         super(position);
     }
@@ -12,7 +28,7 @@ public CnpjRule(int position) {
     public boolean isValid(JFileColumn fileColumn) {
         String cnpj = fileColumn.getText();
 
-        if (cnpj.equals("00000000000000") || cnpj.length() != 14) {
+        if (cnpj.length() != 14 || INVALID_CNPJS.contains(cnpj)) {
             return false;
         }
 
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateAfterRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateAfterRule.java
index f4e5cf5..b2d6654 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateAfterRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateAfterRule.java
@@ -31,6 +31,11 @@ public boolean isValid(JFileColumn fileColumn) {
         return date.compareTo(getComparingDate()) > 0;
     }
 
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getDate(dateFormat) != null && getComparingDate() != null;
+    }
+
     private Date getComparingDate() {
         if (columnPosition == -1) {
             return min;
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateBeforeRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateBeforeRule.java
index 78e70f3..eae1840 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateBeforeRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateBeforeRule.java
@@ -31,6 +31,11 @@ public boolean isValid(JFileColumn fileColumn) {
         return date.compareTo(getComparingDate()) < 0;
     }
 
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getDate(dateFormat) != null && getComparingDate() != null;
+    }
+
     private Date getComparingDate() {
         if (columnPosition == -1) {
             return max;
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateFutureOrPresentRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateFutureOrPresentRule.java
index dbcbf0a..a4043b9 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateFutureOrPresentRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateFutureOrPresentRule.java
@@ -22,4 +22,9 @@ public boolean isValid(JFileColumn fileColumn) {
 
         return current.compareTo(date) <= 0;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getDate(dateFormat) != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateFutureRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateFutureRule.java
index 2b6716c..81e3147 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateFutureRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DateFutureRule.java
@@ -8,18 +8,23 @@
 
 public class DateFutureRule extends AbstractColumnRule {
 
-    private final DateFormat formatter;
+    private final DateFormat dateFormat;
 
-    public DateFutureRule(int position, DateFormat formatter) {
+    public DateFutureRule(int position, DateFormat dateFormat) {
         super(position);
-        this.formatter = formatter;
+        this.dateFormat = dateFormat;
     }
 
     @Override
     public boolean isValid(JFileColumn fileColumn) {
-        Date date = fileColumn.getDate(formatter);
+        Date date = fileColumn.getDate(dateFormat);
         Date current = Calendar.getInstance().getTime();
 
         return current.before(date);
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getDate(dateFormat) != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DatePastOrPresentRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DatePastOrPresentRule.java
index fd26765..5309d04 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DatePastOrPresentRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DatePastOrPresentRule.java
@@ -22,4 +22,9 @@ public boolean isValid(JFileColumn fileColumn) {
 
         return current.compareTo(date) >= 0;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getDate(dateFormat) != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DatePastRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DatePastRule.java
index 170273c..21afb45 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DatePastRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DatePastRule.java
@@ -8,18 +8,23 @@
 
 public class DatePastRule extends AbstractColumnRule {
 
-    private final DateFormat formatter;
+    private final DateFormat dateFormat;
 
-    public DatePastRule(int position, DateFormat formatter) {
+    public DatePastRule(int position, DateFormat dateFormat) {
         super(position);
-        this.formatter = formatter;
+        this.dateFormat = dateFormat;
     }
 
     @Override
     public boolean isValid(JFileColumn fileColumn) {
-        Date date = fileColumn.getDate(formatter);
+        Date date = fileColumn.getDate(dateFormat);
         Date current = Calendar.getInstance().getTime();
 
         return current.after(date);
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getDate(dateFormat) != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainCharacterRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainCharacterRule.java
index 2cd0d84..ef5264f 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainCharacterRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainCharacterRule.java
@@ -17,4 +17,9 @@ public DomainCharacterRule(int position, List<Character> domains) {
     public boolean isValid(JFileColumn fileColumn) {
         return domains.contains(fileColumn.getCharacter());
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getCharacter() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainIntegerRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainIntegerRule.java
index 94a96b1..2193ce4 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainIntegerRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainIntegerRule.java
@@ -17,4 +17,9 @@ public DomainIntegerRule(int position, List<Integer> domains) {
     public boolean isValid(JFileColumn fileColumn) {
         return domains.contains(fileColumn.getInt());
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getInt() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainLongRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainLongRule.java
index 61c91f8..4385815 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainLongRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainLongRule.java
@@ -17,4 +17,9 @@ public DomainLongRule(int position, List<Long> domains) {
     public boolean isValid(JFileColumn fileColumn) {
         return domains.contains(fileColumn.getLong());
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getLong() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainShortRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainShortRule.java
index 71df55e..d843fcb 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainShortRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DomainShortRule.java
@@ -17,4 +17,9 @@ public DomainShortRule(int position, List<Short> domains) {
     public boolean isValid(JFileColumn fileColumn) {
         return domains.contains(fileColumn.getShort());
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getShort() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DoubleTypeRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DoubleTypeRule.java
index 3c83ec3..5d90dc2 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DoubleTypeRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/DoubleTypeRule.java
@@ -10,11 +10,7 @@ public DoubleTypeRule(int position) {
 
     @Override
     public boolean isValid(JFileColumn fileColumn) {
-        try {
-            return fileColumn.getText().isEmpty() || fileColumn.getDouble() != null;
-        } catch (NumberFormatException e) {
-            return false;
-        }
+        return fileColumn.getText().isEmpty() || fileColumn.getDouble() != null;
     }
 
     @Override
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/FloatTypeRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/FloatTypeRule.java
index ffa2cae..25a1b52 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/FloatTypeRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/FloatTypeRule.java
@@ -10,11 +10,7 @@ public FloatTypeRule(int position) {
 
     @Override
     public boolean isValid(JFileColumn fileColumn) {
-        try {
-            return fileColumn.getText().isEmpty() || fileColumn.getFloat() != null;
-        } catch (NumberFormatException e) {
-            return false;
-        }
+        return fileColumn.getText().isEmpty() || fileColumn.getFloat() != null;
     }
 
     @Override
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/IntegerTypeRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/IntegerTypeRule.java
index d45e442..abf2869 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/IntegerTypeRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/IntegerTypeRule.java
@@ -10,11 +10,7 @@ public IntegerTypeRule(int position) {
 
     @Override
     public boolean isValid(JFileColumn fileColumn) {
-        try {
-            return fileColumn.getText().isEmpty() || fileColumn.getInt() != null;
-        } catch (NumberFormatException e) {
-            return false;
-        }
+        return fileColumn.getText().isEmpty() || fileColumn.getInt() != null;
     }
 
     @Override
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateAfterRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateAfterRule.java
index c4f55f6..0c8b101 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateAfterRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateAfterRule.java
@@ -33,7 +33,7 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDate(dateTimeFormatter) != null && getComparingDate() != null;
     }
 
     private LocalDate getComparingDate() {
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateBeforeRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateBeforeRule.java
index 51c81df..af18aa8 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateBeforeRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateBeforeRule.java
@@ -33,7 +33,7 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDate(dateTimeFormatter) != null && getComparingDate() != null;
     }
 
     private LocalDate getComparingDate() {
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateFutureOrPresentRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateFutureOrPresentRule.java
index 096a91c..50ee2d8 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateFutureOrPresentRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateFutureOrPresentRule.java
@@ -24,6 +24,6 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDate(dateTimeFormatter) != null;
     }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateFutureRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateFutureRule.java
index 495d8db..2e81c94 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateFutureRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateFutureRule.java
@@ -24,6 +24,6 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDate(dateTimeFormatter) != null;
     }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDatePastOrPresentRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDatePastOrPresentRule.java
index 3679ee2..e4515b7 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDatePastOrPresentRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDatePastOrPresentRule.java
@@ -24,6 +24,6 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDate(dateTimeFormatter) != null;
     }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDatePastRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDatePastRule.java
index d60ef72..baf77a3 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDatePastRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDatePastRule.java
@@ -24,6 +24,6 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDate(dateTimeFormatter) != null;
     }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeAfterRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeAfterRule.java
index 7af4c5d..c50f1fc 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeAfterRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeAfterRule.java
@@ -33,7 +33,7 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDateTime(dateTimeFormatter) != null && getComparingDate() != null;
     }
 
     private LocalDateTime getComparingDate() {
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeBeforeRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeBeforeRule.java
index 662eee7..471ff6e 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeBeforeRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeBeforeRule.java
@@ -33,7 +33,7 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDateTime(dateTimeFormatter) != null && getComparingDate() != null;
     }
 
     private LocalDateTime getComparingDate() {
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeFutureOrPresentRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeFutureOrPresentRule.java
index bc06265..e24b7be 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeFutureOrPresentRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeFutureOrPresentRule.java
@@ -24,6 +24,6 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTimeTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDateTime(dateTimeFormatter) != null;
     }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeFutureRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeFutureRule.java
index 5960f67..1f14fb2 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeFutureRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimeFutureRule.java
@@ -24,6 +24,6 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTimeTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDateTime(dateTimeFormatter) != null;
     }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimePastOrPresentRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimePastOrPresentRule.java
index 8f3961e..767b867 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimePastOrPresentRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimePastOrPresentRule.java
@@ -24,6 +24,6 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        return new LocalDateTimeTypeRule(getPosition(), dateTimeFormatter).isValid(fileColumn);
+        return fileColumn.getLocalDateTime(dateTimeFormatter) != null;
     }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimePastRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimePastRule.java
index a89ff3f..5392d4a 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimePastRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/LocalDateTimePastRule.java
@@ -4,20 +4,19 @@
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
-import java.time.format.DateTimeParseException;
 
 public class LocalDateTimePastRule extends AbstractColumnRule {
 
-    private final DateTimeFormatter formatter;
+    private final DateTimeFormatter dateTimeFormatter;
 
-    public LocalDateTimePastRule(int position, DateTimeFormatter formatter) {
+    public LocalDateTimePastRule(int position, DateTimeFormatter dateTimeFormatter) {
         super(position);
-        this.formatter = formatter;
+        this.dateTimeFormatter = dateTimeFormatter;
     }
 
     @Override
     public boolean isValid(JFileColumn fileColumn) {
-        LocalDateTime date = fileColumn.getLocalDateTime(formatter);
+        LocalDateTime date = fileColumn.getLocalDateTime(dateTimeFormatter);
         LocalDateTime current = LocalDateTime.now();
 
         return current.compareTo(date) > 0;
@@ -25,10 +24,6 @@ public boolean isValid(JFileColumn fileColumn) {
 
     @Override
     public boolean canValidate(JFileColumn fileColumn) {
-        try {
-            return fileColumn.getLocalDateTime(formatter) != null;
-        } catch (DateTimeParseException e) {
-            return false;
-        }
+        return fileColumn.getLocalDateTime(dateTimeFormatter) != null;
     }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxBigDecimalRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxBigDecimalRule.java
index 76b006f..dd30dab 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxBigDecimalRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxBigDecimalRule.java
@@ -20,4 +20,9 @@ public MaxBigDecimalRule(int position, BigDecimal max, DecimalFormat decimalForm
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getBigDecimal(decimalFormat).compareTo(max) <= 0;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getBigDecimal(decimalFormat) != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxBigIntegerRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxBigIntegerRule.java
index 7315a46..aa43c2f 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxBigIntegerRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxBigIntegerRule.java
@@ -17,4 +17,9 @@ public MaxBigIntegerRule(int position, BigInteger max) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getBigInteger().compareTo(max) <= 0;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getBigInteger() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxDoubleRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxDoubleRule.java
index b49f550..3b9e506 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxDoubleRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxDoubleRule.java
@@ -15,4 +15,9 @@ public MaxDoubleRule(int position, double max) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getDouble() <= max;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getDouble() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxFloatRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxFloatRule.java
index 9156ee1..5d3e739 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxFloatRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxFloatRule.java
@@ -15,4 +15,9 @@ public MaxFloatRule(int position, float max) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getFloat() <= max;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getFloat() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxIntegerRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxIntegerRule.java
index ad813e3..c600d15 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxIntegerRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxIntegerRule.java
@@ -15,4 +15,9 @@ public MaxIntegerRule(int position, int max) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getInt() <= max;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getInt() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxLongRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxLongRule.java
index aa6546f..a2a29e9 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxLongRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxLongRule.java
@@ -15,4 +15,9 @@ public MaxLongRule(int position, long max) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getLong() <= max;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getLong() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxShortRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxShortRule.java
index 9a8fd50..f1ef28d 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxShortRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MaxShortRule.java
@@ -15,4 +15,9 @@ public MaxShortRule(int position, short max) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getShort() <= max;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getShort() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinBigDecimalRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinBigDecimalRule.java
index 4bfcc86..286d86d 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinBigDecimalRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinBigDecimalRule.java
@@ -20,4 +20,9 @@ public MinBigDecimalRule(int position, BigDecimal min, DecimalFormat decimalForm
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getBigDecimal(decimalFormat).compareTo(min) >= 0;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getBigDecimal(decimalFormat) != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinBigIntegerRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinBigIntegerRule.java
index 3ce3042..f7daab2 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinBigIntegerRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinBigIntegerRule.java
@@ -17,4 +17,9 @@ public MinBigIntegerRule(int position, BigInteger min) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getBigInteger().compareTo(min) >= 0;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getBigInteger() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinDoubleRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinDoubleRule.java
index f2f165f..9db24ac 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinDoubleRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinDoubleRule.java
@@ -15,4 +15,9 @@ public MinDoubleRule(int position, double min) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getDouble() >= min;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getDouble() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinFloatRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinFloatRule.java
index a3927c9..d07a079 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinFloatRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinFloatRule.java
@@ -15,4 +15,9 @@ public MinFloatRule(int position, float min) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getFloat() >= min;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getFloat() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinIntegerRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinIntegerRule.java
index 25ee79a..b83cab9 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinIntegerRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinIntegerRule.java
@@ -15,4 +15,9 @@ public MinIntegerRule(int position, int min) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getInt() >= min;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getInt() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinLongRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinLongRule.java
index aa40440..4aa6228 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinLongRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinLongRule.java
@@ -15,4 +15,9 @@ public MinLongRule(int position, long min) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getLong() >= min;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getLong() != null;
+    }
 }
diff --git a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinShortRule.java b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinShortRule.java
index 236bb21..9fc37f9 100644
--- a/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinShortRule.java
+++ b/src/main/java/com/jonpereiradev/jfile/reader/rule/column/MinShortRule.java
@@ -15,4 +15,9 @@ public MinShortRule(int position, short min) {
     public boolean isValid(JFileColumn fileColumn) {
         return fileColumn.getShort() >= min;
     }
+
+    @Override
+    public boolean canValidate(JFileColumn fileColumn) {
+        return fileColumn.getShort() != null;
+    }
 }