You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2018/10/18 12:59:36 UTC

[incubator-plc4x] branch master updated (d94b11c -> 5903b53)

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git.


    from d94b11c  [Modbus] remove validation on reading by avoiding supplying of null items in the first place.
     new 5301025  - Made the FieldItems throw Exceptions in case of incompatible data types and values.
     new 5903b53  - Fine tuned the example

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../plc4x/java/examples/helloplc4x/HelloPlc4x.java | 126 ++++++++++-----------
 ....java => PlcIncompatibleDatatypeException.java} |  14 +--
 .../messages/items/DefaultBigDecimalFieldItem.java |  71 ++++++------
 .../messages/items/DefaultBigIntegerFieldItem.java |  73 ++++++------
 .../messages/items/DefaultBooleanFieldItem.java    |   8 +-
 .../messages/items/DefaultByteArrayFieldItem.java  |   5 +
 .../base/messages/items/DefaultByteFieldItem.java  |  71 ++++++------
 .../messages/items/DefaultDoubleFieldItem.java     |  69 +++++------
 .../base/messages/items/DefaultFloatFieldItem.java |  69 +++++------
 .../messages/items/DefaultIntegerFieldItem.java    |  71 ++++++------
 .../messages/items/DefaultLocalDateFieldItem.java  |   8 +-
 .../items/DefaultLocalDateTimeFieldItem.java       |  20 ++--
 .../messages/items/DefaultLocalTimeFieldItem.java  |   8 +-
 .../base/messages/items/DefaultLongFieldItem.java  |  71 ++++++------
 .../base/messages/items/DefaultShortFieldItem.java |  71 ++++++------
 .../messages/items/DefaultStringFieldItem.java     |   8 +-
 .../plc4x/java/base/messages/items/FieldItem.java  |  31 ++---
 17 files changed, 419 insertions(+), 375 deletions(-)
 copy plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/{PlcNotImplementedException.java => PlcIncompatibleDatatypeException.java} (73%)


[incubator-plc4x] 02/02: - Fine tuned the example

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit 5903b53528739953202451ed3560cd74f5420035
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Oct 18 14:59:33 2018 +0200

    - Fine tuned the example
---
 .../plc4x/java/examples/helloplc4x/HelloPlc4x.java | 126 ++++++++++-----------
 1 file changed, 58 insertions(+), 68 deletions(-)

diff --git a/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java b/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
index f8928dc..f321248 100644
--- a/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
+++ b/examples/hello-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
@@ -23,98 +23,88 @@ import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
+import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
 
 public class HelloPlc4x {
 
-    private static final Logger logger = LoggerFactory.getLogger(HelloPlc4x.class);
-
     /**
      * Example code do demonstrate using PLC4X.
      *
      * @param args ignored.
      */
-    public static void main(String[] args) {
-        if (args.length < 2) {
-            System.out.println("Usage: HelloPlc4x {connection-string} {address-string}+");
-            System.out.println("Example: HelloPlc4x s7://10.10.64.20/1/1 %Q0.0:BOOL %Q0:BYTE");
+public static void main(String[] args) throws Exception {
+    if (args.length < 2) {
+        System.out.println("Usage: HelloPlc4x {connection-string} {address-string}+");
+        System.out.println("Example: HelloPlc4x s7://10.10.64.20/1/1 %Q0.0:BOOL %Q0:BYTE");
+        return;
+    }
+
+    // Establish a connection to the plc using the url provided as first argument
+    try (PlcConnection plcConnection = new PlcDriverManager().getConnection(args[0])) {
+
+        // Check if this connection support reading of data.
+        Optional<PlcReadRequest.Builder> builderOptional = plcConnection.readRequestBuilder();
+        if (!builderOptional.isPresent()) {
+            System.err.println("This connection doesn't support reading.");
             return;
         }
 
-        // Establish a connection to the plc using the url provided as first argument
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(args[0])) {
-
-            // Check if this connection support reading of data.
-            if (plcConnection.readRequestBuilder().isPresent()) {
+        // Create a new read request:
+        // - Give the single item requested the alias name "value"
+        PlcReadRequest.Builder builder = builderOptional.get();
+        for (int i = 1; i < args.length; i++) {
+            builder.addItem("value-" + i, args[i]);
+        }
+        PlcReadRequest readRequest = builder.build();
 
-                // Create a new read request:
-                // - Give the single item requested the alias name "value"
-                PlcReadRequest.Builder syncBuilder = plcConnection.readRequestBuilder().get();
-                for (int i = 1; i < args.length; i++) {
-                    syncBuilder.addItem("value-" + i, args[i]);
-                }
-                PlcReadRequest syncPlcReadRequest = syncBuilder.build();
+        //////////////////////////////////////////////////////////
+        // Read synchronously ...
+        // NOTICE: the ".get()" immediately lets this thread pause until
+        // the response is processed and available.
+        System.out.println("Synchronous request ...");
+        PlcReadResponse syncResponse = readRequest.execute().get();
+        // Simply iterating over the field names returned in the response.
+        printResponse(syncResponse);
 
-                //////////////////////////////////////////////////////////
-                // Read synchronously ...
-                // NOTICE: the ".get()" immediately lets this thread pause till
-                // the response is processed and available.
-                System.out.println("\nSynchronous request ...");
-                PlcReadResponse syncResponse = syncPlcReadRequest.execute().get();
-                // Simply iterating over the field names returned in the response.
+        //////////////////////////////////////////////////////////
+        // Read asynchronously ...
+        // Register a callback executed as soon as a response arrives.
+        System.out.println("Asynchronous request ...");
+        CompletableFuture<? extends PlcReadResponse> asyncResponse = readRequest.execute();
+        asyncResponse.whenComplete((readResponse, throwable) -> {
+            if (readResponse != null) {
                 printResponse(syncResponse);
-
-                //////////////////////////////////////////////////////////
-                // Read asynchronously ...
-                // Register a callback executed as soon as a response arives.
-                PlcReadRequest.Builder asyncBuilder = plcConnection.readRequestBuilder().get();
-                for (int i = 1; i < args.length; i++) {
-                    asyncBuilder.addItem("value-" + i, args[i]);
-                }
-                PlcReadRequest asyncPlcReadRequest = asyncBuilder.build();
-                System.out.println("\n\nAsynchronous request ...");
-                CompletableFuture<? extends PlcReadResponse> asyncResponse = asyncPlcReadRequest.execute();
-                asyncResponse.whenComplete((readResponse, throwable) -> {
-                    if (readResponse != null) {
-                        printResponse(syncResponse);
-                    } else {
-                        logger.error("An error occurred", throwable);
-                    }
-                });
             } else {
-                logger.info("This connection doesn't support reading.");
+                System.err.println("An error occurred: " + throwable.getMessage());
+                throwable.printStackTrace();
             }
-        }
-        // Catch any exception or the application won't be able to finish if something goes wrong.
-        catch (Exception e) {
-            logger.error("An error occurred", e);
-        }
+        });
     }
+}
 
-    private static void printResponse(PlcReadResponse syncResponse) {
-        for (String fieldName : syncResponse.getFieldNames()) {
-            if(syncResponse.getResponseCode(fieldName) == PlcResponseCode.OK) {
-                int numValues = syncResponse.getNumberOfValues(fieldName);
-                // If it's just one element, output just one single line.
-                if(numValues == 1) {
-                    System.out.println("Value[" + fieldName + "]: " + syncResponse.getObject(fieldName));
-                }
-                // If it's more than one element, output each in a single row.
-                else {
-                    System.out.println("Value[" + fieldName + "]:");
-                    for(int i = 0; i < numValues; i++) {
-                        System.out.println(" - " + syncResponse.getObject(fieldName, i));
-                    }
-                }
+private static void printResponse(PlcReadResponse response) {
+    for (String fieldName : response.getFieldNames()) {
+        if(response.getResponseCode(fieldName) == PlcResponseCode.OK) {
+            int numValues = response.getNumberOfValues(fieldName);
+            // If it's just one element, output just one single line.
+            if(numValues == 1) {
+                System.out.println("Value[" + fieldName + "]: " + response.getObject(fieldName));
             }
-            // Something went wrong, to output an error message instead.
+            // If it's more than one element, output each in a single row.
             else {
-                System.out.println("Error[" + fieldName + "]: " + syncResponse.getResponseCode(fieldName).name());
+                System.out.println("Value[" + fieldName + "]:");
+                for(int i = 0; i < numValues; i++) {
+                    System.out.println(" - " + response.getObject(fieldName, i));
+                }
             }
         }
+        // Something went wrong, to output an error message instead.
+        else {
+            System.out.println("Error[" + fieldName + "]: " + response.getResponseCode(fieldName).name());
+        }
     }
+}
 
 }


[incubator-plc4x] 01/02: - Made the FieldItems throw Exceptions in case of incompatible data types and values.

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit 5301025d40c67b59a9c87fe6bf794ab2ead02dd0
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Oct 18 14:59:17 2018 +0200

    - Made the FieldItems throw Exceptions in case of incompatible data types and values.
---
 .../PlcIncompatibleDatatypeException.java          | 28 +++++++++
 .../messages/items/DefaultBigDecimalFieldItem.java | 71 +++++++++++----------
 .../messages/items/DefaultBigIntegerFieldItem.java | 73 +++++++++++-----------
 .../messages/items/DefaultBooleanFieldItem.java    |  8 ++-
 .../messages/items/DefaultByteArrayFieldItem.java  |  5 ++
 .../base/messages/items/DefaultByteFieldItem.java  | 71 +++++++++++----------
 .../messages/items/DefaultDoubleFieldItem.java     | 69 ++++++++++----------
 .../base/messages/items/DefaultFloatFieldItem.java | 69 ++++++++++----------
 .../messages/items/DefaultIntegerFieldItem.java    | 71 +++++++++++----------
 .../messages/items/DefaultLocalDateFieldItem.java  |  8 ++-
 .../items/DefaultLocalDateTimeFieldItem.java       | 20 +++---
 .../messages/items/DefaultLocalTimeFieldItem.java  |  8 ++-
 .../base/messages/items/DefaultLongFieldItem.java  | 71 +++++++++++----------
 .../base/messages/items/DefaultShortFieldItem.java | 71 +++++++++++----------
 .../messages/items/DefaultStringFieldItem.java     |  8 ++-
 .../plc4x/java/base/messages/items/FieldItem.java  | 31 ++++-----
 16 files changed, 382 insertions(+), 300 deletions(-)

diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIncompatibleDatatypeException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIncompatibleDatatypeException.java
new file mode 100644
index 0000000..cb779df
--- /dev/null
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIncompatibleDatatypeException.java
@@ -0,0 +1,28 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
+
+package org.apache.plc4x.java.api.exceptions;
+
+public class PlcIncompatibleDatatypeException extends PlcRuntimeException {
+
+    public PlcIncompatibleDatatypeException(Class<?> datatype, int index) {
+        super("Incompatible Datatype " + datatype.getName() + " at index " + index);
+    }
+
+}
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java
index 17a5ed7..2b9466c 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigDecimalFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
@@ -39,10 +41,10 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
 
     @Override
     public Boolean getBoolean(int index) {
-        if (isValidBoolean(index)) {
-            return getValue(index).compareTo(BigDecimal.ZERO) != 0;
+        if (!isValidBoolean(index)) {
+            throw new PlcIncompatibleDatatypeException(Boolean.class, index);
         }
-        return null;
+        return getValue(index).compareTo(BigDecimal.ZERO) != 0;
     }
 
     @Override
@@ -55,10 +57,10 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
 
     @Override
     public Byte getByte(int index) {
-        if (isValidByte(index)) {
-            return getValue(index).byteValue();
+        if (!isValidByte(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
         }
-        return null;
+        return getValue(index).byteValue();
     }
 
     @Override
@@ -71,10 +73,10 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
 
     @Override
     public Short getShort(int index) {
-        if (isValidShort(index)) {
-            return getValue(index).shortValue();
+        if (!isValidShort(index)) {
+            throw new PlcIncompatibleDatatypeException(Short.class, index);
         }
-        return null;
+        return getValue(index).shortValue();
     }
 
     @Override
@@ -87,22 +89,10 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
 
     @Override
     public Integer getInteger(int index) {
-        if (isValidInteger(index)) {
-            return getValue(index).intValue();
-        }
-        return null;
-    }
-
-    public boolean isValidBigInteger(int index) {
-        BigDecimal value = getValue(index);
-        return value != null;
-    }
-
-    public BigInteger getBigInteger(int index) {
-        if (isValidBigInteger(index)) {
-            return getValue(index).toBigInteger();
+        if (!isValidInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(Integer.class, index);
         }
-        return null;
+        return getValue(index).intValue();
     }
 
     @Override
@@ -115,10 +105,22 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
 
     @Override
     public Long getLong(int index) {
-        if (isValidLong(index)) {
-            return getValue(index).longValue();
+        if (!isValidLong(index)) {
+            throw new PlcIncompatibleDatatypeException(Long.class, index);
         }
-        return null;
+        return getValue(index).longValue();
+    }
+
+    public boolean isValidBigInteger(int index) {
+        BigDecimal value = getValue(index);
+        return value != null;
+    }
+
+    public BigInteger getBigInteger(int index) {
+        if (!isValidBigInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
+        }
+        return getValue(index).toBigInteger();
     }
 
     @Override
@@ -131,10 +133,10 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
 
     @Override
     public Float getFloat(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index).floatValue();
+        if (!isValidFloat(index)) {
+            throw new PlcIncompatibleDatatypeException(Float.class, index);
         }
-        return null;
+        return getValue(index).floatValue();
     }
 
     @Override
@@ -147,10 +149,10 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
 
     @Override
     public Double getDouble(int index) {
-        if (isValidDouble(index)) {
-            return getValue(index).doubleValue();
+        if (!isValidDouble(index)) {
+            throw new PlcIncompatibleDatatypeException(Double.class, index);
         }
-        return null;
+        return getValue(index).doubleValue();
     }
 
     public boolean isValidBigDecimal(int index) {
@@ -158,6 +160,9 @@ public class DefaultBigDecimalFieldItem extends FieldItem<BigDecimal> {
     }
 
     public BigDecimal getBigDecimal(int index) {
+        if(!isValidBigDecimal(index)) {
+            throw new PlcIncompatibleDatatypeException(BigDecimal.class, index);
+        }
         return getValue(index);
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java
index 9e30774..08decfb 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBigIntegerFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
@@ -39,10 +41,10 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public Boolean getBoolean(int index) {
-        if (isValidBoolean(index)) {
-            return getValue(index).compareTo(BigInteger.ZERO) == 0;
+        if (!isValidBoolean(index)) {
+            throw new PlcIncompatibleDatatypeException(Boolean.class, index);
         }
-        return null;
+        return getValue(index).compareTo(BigInteger.ZERO) == 0;
     }
 
     @Override
@@ -54,10 +56,10 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public Byte getByte(int index) {
-        if (isValidByte(index)) {
-            return getValue(index).byteValue();
+        if (!isValidByte(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
         }
-        return null;
+        return getValue(index).byteValue();
     }
 
     @Override
@@ -69,10 +71,10 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public Short getShort(int index) {
-        if (isValidShort(index)) {
-            return getValue(index).shortValue();
+        if (!isValidShort(index)) {
+            throw new PlcIncompatibleDatatypeException(Short.class, index);
         }
-        return null;
+        return getValue(index).shortValue();
     }
 
     @Override
@@ -84,23 +86,10 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public Integer getInteger(int index) {
-        if (isValidInteger(index)) {
-            BigInteger value = getValue(index);
-            return value.intValue();
-        }
-        return null;
-    }
-
-    public boolean isValidBigInteger(int index) {
-        BigInteger value = getValue(index);
-        return value != null;
-    }
-
-    public BigInteger getBigInteger(int index) {
-        if (isValidBigInteger(index)) {
-            return getValue(index);
+        if (!isValidInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(Integer.class, index);
         }
-        return null;
+        return getValue(index).intValue();
     }
 
     @Override
@@ -112,11 +101,22 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public Long getLong(int index) {
-        if (isValidLong(index)) {
-            BigInteger value = getValue(index);
-            return value.longValue();
+        if (!isValidLong(index)) {
+            throw new PlcIncompatibleDatatypeException(Long.class, index);
         }
-        return null;
+        return getValue(index).longValue();
+    }
+
+    public boolean isValidBigInteger(int index) {
+        BigInteger value = getValue(index);
+        return value != null;
+    }
+
+    public BigInteger getBigInteger(int index) {
+        if (!isValidBigInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
+        }
+        return getValue(index);
     }
 
     @Override
@@ -132,10 +132,10 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public Float getFloat(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index).floatValue();
+        if (!isValidFloat(index)) {
+            throw new PlcIncompatibleDatatypeException(Float.class, index);
         }
-        return null;
+        return getValue(index).floatValue();
     }
 
     @Override
@@ -151,10 +151,10 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
 
     @Override
     public Double getDouble(int index) {
-        if (isValidDouble(index)) {
-            return getValue(index).doubleValue();
+        if (!isValidDouble(index)) {
+            throw new PlcIncompatibleDatatypeException(Double.class, index);
         }
-        return null;
+        return getValue(index).doubleValue();
     }
 
     public boolean isValidBigDecimal(int index) {
@@ -162,6 +162,9 @@ public class DefaultBigIntegerFieldItem extends FieldItem<BigInteger> {
     }
 
     public BigDecimal getBigDecimal(int index) {
+        if(!isValidBigDecimal(index)) {
+            throw new PlcIncompatibleDatatypeException(BigDecimal.class, index);
+        }
         return new BigDecimal(getValue(index));
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java
index abb02b4..0e85bed 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultBooleanFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.util.BitSet;
 
 public class DefaultBooleanFieldItem extends FieldItem<Boolean> {
@@ -38,10 +40,10 @@ public class DefaultBooleanFieldItem extends FieldItem<Boolean> {
 
     @Override
     public Boolean getBoolean(int index) {
-        if (isValidBoolean(index)) {
-            return getValue(index);
+        if (!isValidBoolean(index)) {
+            throw new PlcIncompatibleDatatypeException(Boolean.class, index);
         }
-        return null;
+        return getValue(index);
     }
 
     @Override
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java
index 0aeac4f..b0732f5 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteArrayFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.util.Objects;
 
 public class DefaultByteArrayFieldItem extends FieldItem<Byte[]> {
@@ -42,6 +44,9 @@ public class DefaultByteArrayFieldItem extends FieldItem<Byte[]> {
 
     @Override
     public Byte[] getByteArray(int index) {
+        if(!isValidByteArray(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte[].class, index);
+        }
         return getValue(index);
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java
index eec3ad7..be6581e 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultByteFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
@@ -39,10 +41,10 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
 
     @Override
     public Boolean getBoolean(int index) {
-        if (isValidBoolean(index)) {
-            return getValue(index) != 0L;
+        if (!isValidBoolean(index)) {
+            throw new PlcIncompatibleDatatypeException(Boolean.class, index);
         }
-        return null;
+        return getValue(index) != 0L;
     }
 
     @Override
@@ -53,10 +55,10 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
 
     @Override
     public Byte getByte(int index) {
-        if (isValidByte(index)) {
-            return getValue(index);
+        if (!isValidByte(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
         }
-        return null;
+        return getValue(index);
     }
 
     @Override
@@ -67,10 +69,10 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
 
     @Override
     public Short getShort(int index) {
-        if (isValidShort(index)) {
-            return getValue(index).shortValue();
+        if (!isValidShort(index)) {
+            throw new PlcIncompatibleDatatypeException(Short.class, index);
         }
-        return null;
+        return getValue(index).shortValue();
     }
 
     @Override
@@ -81,22 +83,10 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
 
     @Override
     public Integer getInteger(int index) {
-        if (isValidInteger(index)) {
-            return getValue(index).intValue();
-        }
-        return null;
-    }
-
-    public boolean isValidBigInteger(int index) {
-        Byte value = getValue(index);
-        return value != null;
-    }
-
-    public BigInteger getBigInteger(int index) {
-        if (isValidBigInteger(index)) {
-            return BigInteger.valueOf(getValue(index));
+        if (!isValidInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(Integer.class, index);
         }
-        return null;
+        return getValue(index).intValue();
     }
 
     @Override
@@ -106,10 +96,22 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
 
     @Override
     public Long getLong(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index).longValue();
+        if (!isValidLong(index)) {
+            throw new PlcIncompatibleDatatypeException(Long.class, index);
         }
-        return null;
+        return getValue(index).longValue();
+    }
+
+    public boolean isValidBigInteger(int index) {
+        Byte value = getValue(index);
+        return value != null;
+    }
+
+    public BigInteger getBigInteger(int index) {
+        if (!isValidBigInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
+        }
+        return BigInteger.valueOf(getValue(index));
     }
 
     @Override
@@ -120,10 +122,10 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
 
     @Override
     public Float getFloat(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index).floatValue();
+        if (!isValidFloat(index)) {
+            throw new PlcIncompatibleDatatypeException(Float.class, index);
         }
-        return null;
+        return getValue(index).floatValue();
     }
 
     @Override
@@ -134,10 +136,10 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
 
     @Override
     public Double getDouble(int index) {
-        if (isValidDouble(index)) {
-            return getValue(index).doubleValue();
+        if (!isValidDouble(index)) {
+            throw new PlcIncompatibleDatatypeException(Double.class, index);
         }
-        return null;
+        return getValue(index).doubleValue();
     }
 
     public boolean isValidBigDecimal(int index) {
@@ -145,6 +147,9 @@ public class DefaultByteFieldItem extends FieldItem<Byte> {
     }
 
     public BigDecimal getBigDecimal(int index) {
+        if(!isValidBigDecimal(index)) {
+            throw new PlcIncompatibleDatatypeException(BigDecimal.class, index);
+        }
         return new BigDecimal(getValue(index));
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java
index 5019ca9..c010cc5 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultDoubleFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
@@ -39,10 +41,10 @@ public class DefaultDoubleFieldItem extends FieldItem<Double> {
 
     @Override
     public Boolean getBoolean(int index) {
-        if (isValidBoolean(index)) {
-            return getValue(index) != 0L;
+        if (!isValidBoolean(index)) {
+            throw new PlcIncompatibleDatatypeException(Boolean.class, index);
         }
-        return null;
+        return getValue(index) != 0L;
     }
 
     @Override
@@ -53,10 +55,10 @@ public class DefaultDoubleFieldItem extends FieldItem<Double> {
 
     @Override
     public Byte getByte(int index) {
-        if (isValidByte(index)) {
-            return getValue(index).byteValue();
+        if (!isValidByte(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
         }
-        return null;
+        return getValue(index).byteValue();
     }
 
     @Override
@@ -67,10 +69,10 @@ public class DefaultDoubleFieldItem extends FieldItem<Double> {
 
     @Override
     public Short getShort(int index) {
-        if (isValidShort(index)) {
-            return getValue(index).shortValue();
+        if (!isValidShort(index)) {
+            throw new PlcIncompatibleDatatypeException(Short.class, index);
         }
-        return null;
+        return getValue(index).shortValue();
     }
 
     @Override
@@ -81,36 +83,36 @@ public class DefaultDoubleFieldItem extends FieldItem<Double> {
 
     @Override
     public Integer getInteger(int index) {
-        if (isValidInteger(index)) {
-            return getValue(index).intValue();
+        if (!isValidInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(Integer.class, index);
         }
-        return null;
+        return getValue(index).intValue();
     }
 
-    public boolean isValidBigInteger(int index) {
+    @Override
+    public boolean isValidLong(int index) {
         Double value = getValue(index);
-        return value != null;
+        return (value != null) && (value <= Long.MAX_VALUE) && (value >= Long.MIN_VALUE);
     }
 
-    public BigInteger getBigInteger(int index) {
-        if (isValidBigInteger(index)) {
-            return BigInteger.valueOf(getValue(index).longValue());
+    @Override
+    public Long getLong(int index) {
+        if (!isValidLong(index)) {
+            throw new PlcIncompatibleDatatypeException(Long.class, index);
         }
-        return null;
+        return getValue(index).longValue();
     }
 
-    @Override
-    public boolean isValidLong(int index) {
+    public boolean isValidBigInteger(int index) {
         Double value = getValue(index);
-        return (value != null) && (value <= Long.MAX_VALUE) && (value >= Long.MIN_VALUE);
+        return value != null;
     }
 
-    @Override
-    public Long getLong(int index) {
-        if (isValidLong(index)) {
-            return getValue(index).longValue();
+    public BigInteger getBigInteger(int index) {
+        if (!isValidBigInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
         }
-        return null;
+        return BigInteger.valueOf(getValue(index).longValue());
     }
 
     @Override
@@ -121,10 +123,10 @@ public class DefaultDoubleFieldItem extends FieldItem<Double> {
 
     @Override
     public Float getFloat(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index).floatValue();
+        if (!isValidFloat(index)) {
+            throw new PlcIncompatibleDatatypeException(Float.class, index);
         }
-        return null;
+        return getValue(index).floatValue();
     }
 
     @Override
@@ -134,10 +136,10 @@ public class DefaultDoubleFieldItem extends FieldItem<Double> {
 
     @Override
     public Double getDouble(int index) {
-        if (isValidDouble(index)) {
-            return getValue(index);
+        if (!isValidDouble(index)) {
+            throw new PlcIncompatibleDatatypeException(Double.class, index);
         }
-        return null;
+        return getValue(index);
     }
 
     public boolean isValidBigDecimal(int index) {
@@ -145,6 +147,9 @@ public class DefaultDoubleFieldItem extends FieldItem<Double> {
     }
 
     public BigDecimal getBigDecimal(int index) {
+        if(!isValidBigDecimal(index)) {
+            throw new PlcIncompatibleDatatypeException(BigDecimal.class, index);
+        }
         return new BigDecimal(getValue(index));
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java
index 53f94e6..36cdc69 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultFloatFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
@@ -39,10 +41,10 @@ public class DefaultFloatFieldItem extends FieldItem<Float> {
 
     @Override
     public Boolean getBoolean(int index) {
-        if (isValidBoolean(index)) {
-            return getValue(index) != 0L;
+        if (!isValidBoolean(index)) {
+            throw new PlcIncompatibleDatatypeException(Boolean.class, index);
         }
-        return null;
+        return getValue(index) != 0L;
     }
 
     @Override
@@ -53,10 +55,10 @@ public class DefaultFloatFieldItem extends FieldItem<Float> {
 
     @Override
     public Byte getByte(int index) {
-        if (isValidByte(index)) {
-            return getValue(index).byteValue();
+        if (!isValidByte(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
         }
-        return null;
+        return getValue(index).byteValue();
     }
 
     @Override
@@ -67,10 +69,10 @@ public class DefaultFloatFieldItem extends FieldItem<Float> {
 
     @Override
     public Short getShort(int index) {
-        if (isValidShort(index)) {
-            return getValue(index).shortValue();
+        if (!isValidShort(index)) {
+            throw new PlcIncompatibleDatatypeException(Short.class, index);
         }
-        return null;
+        return getValue(index).shortValue();
     }
 
     @Override
@@ -81,36 +83,36 @@ public class DefaultFloatFieldItem extends FieldItem<Float> {
 
     @Override
     public Integer getInteger(int index) {
-        if (isValidInteger(index)) {
-            return getValue(index).intValue();
+        if (!isValidInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(Integer.class, index);
         }
-        return null;
+        return getValue(index).intValue();
     }
 
-    public boolean isValidBigInteger(int index) {
+    @Override
+    public boolean isValidLong(int index) {
         Float value = getValue(index);
-        return value != null;
+        return (value != null) && (value <= Long.MAX_VALUE) && (value >= Long.MIN_VALUE);
     }
 
-    public BigInteger getBigInteger(int index) {
-        if (isValidBigInteger(index)) {
-            return BigInteger.valueOf(getValue(index).longValue());
+    @Override
+    public Long getLong(int index) {
+        if (!isValidLong(index)) {
+            throw new PlcIncompatibleDatatypeException(Long.class, index);
         }
-        return null;
+        return getValue(index).longValue();
     }
 
-    @Override
-    public boolean isValidLong(int index) {
+    public boolean isValidBigInteger(int index) {
         Float value = getValue(index);
-        return (value != null) && (value <= Long.MAX_VALUE) && (value >= Long.MIN_VALUE);
+        return value != null;
     }
 
-    @Override
-    public Long getLong(int index) {
-        if (isValidLong(index)) {
-            return getValue(index).longValue();
+    public BigInteger getBigInteger(int index) {
+        if (!isValidBigInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
         }
-        return null;
+        return BigInteger.valueOf(getValue(index).longValue());
     }
 
     @Override
@@ -121,10 +123,10 @@ public class DefaultFloatFieldItem extends FieldItem<Float> {
 
     @Override
     public Float getFloat(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index);
+        if (!isValidFloat(index)) {
+            throw new PlcIncompatibleDatatypeException(Float.class, index);
         }
-        return null;
+        return getValue(index);
     }
 
     @Override
@@ -134,10 +136,10 @@ public class DefaultFloatFieldItem extends FieldItem<Float> {
 
     @Override
     public Double getDouble(int index) {
-        if (isValidDouble(index)) {
-            return getValue(index).doubleValue();
+        if (!isValidDouble(index)) {
+            throw new PlcIncompatibleDatatypeException(Double.class, index);
         }
-        return null;
+        return getValue(index).doubleValue();
     }
 
     public boolean isValidBigDecimal(int index) {
@@ -145,6 +147,9 @@ public class DefaultFloatFieldItem extends FieldItem<Float> {
     }
 
     public BigDecimal getBigDecimal(int index) {
+        if(!isValidBigDecimal(index)) {
+            throw new PlcIncompatibleDatatypeException(BigDecimal.class, index);
+        }
         return new BigDecimal(getValue(index));
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
index 3f2de70..dc12131 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultIntegerFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
@@ -39,10 +41,10 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
 
     @Override
     public Boolean getBoolean(int index) {
-        if (isValidBoolean(index)) {
-            return getValue(index) != 0L;
+        if (!isValidBoolean(index)) {
+            throw new PlcIncompatibleDatatypeException(Boolean.class, index);
         }
-        return null;
+        return getValue(index) != 0L;
     }
 
     @Override
@@ -53,10 +55,10 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
 
     @Override
     public Byte getByte(int index) {
-        if (isValidByte(index)) {
-            return getValue(index).byteValue();
+        if (!isValidByte(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
         }
-        return null;
+        return getValue(index).byteValue();
     }
 
     @Override
@@ -67,10 +69,10 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
 
     @Override
     public Short getShort(int index) {
-        if (isValidShort(index)) {
-            return getValue(index).shortValue();
+        if (!isValidShort(index)) {
+            throw new PlcIncompatibleDatatypeException(Short.class, index);
         }
-        return null;
+        return getValue(index).shortValue();
     }
 
     @Override
@@ -81,22 +83,10 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
 
     @Override
     public Integer getInteger(int index) {
-        if (isValidInteger(index)) {
-            return getValue(index);
-        }
-        return null;
-    }
-
-    public boolean isValidBigInteger(int index) {
-        Integer value = getValue(index);
-        return value != null;
-    }
-
-    public BigInteger getBigInteger(int index) {
-        if (isValidBigInteger(index)) {
-            return BigInteger.valueOf(getValue(index));
+        if (!isValidInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(Integer.class, index);
         }
-        return null;
+        return getValue(index);
     }
 
     @Override
@@ -106,10 +96,22 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
 
     @Override
     public Long getLong(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index).longValue();
+        if (!isValidFloat(index)) {
+            throw new PlcIncompatibleDatatypeException(Long.class, index);
         }
-        return null;
+        return getValue(index).longValue();
+    }
+
+    public boolean isValidBigInteger(int index) {
+        Integer value = getValue(index);
+        return value != null;
+    }
+
+    public BigInteger getBigInteger(int index) {
+        if (!isValidBigInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
+        }
+        return BigInteger.valueOf(getValue(index));
     }
 
     @Override
@@ -120,10 +122,10 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
 
     @Override
     public Float getFloat(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index).floatValue();
+        if (!isValidFloat(index)) {
+            throw new PlcIncompatibleDatatypeException(Float.class, index);
         }
-        return null;
+        return getValue(index).floatValue();
     }
 
     @Override
@@ -134,10 +136,10 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
 
     @Override
     public Double getDouble(int index) {
-        if (isValidDouble(index)) {
-            return getValue(index).doubleValue();
+        if (!isValidDouble(index)) {
+            throw new PlcIncompatibleDatatypeException(Double.class, index);
         }
-        return null;
+        return getValue(index).doubleValue();
     }
 
     public boolean isValidBigDecimal(int index) {
@@ -145,6 +147,9 @@ public class DefaultIntegerFieldItem extends FieldItem<Integer> {
     }
 
     public BigDecimal getBigDecimal(int index) {
+        if(!isValidBigDecimal(index)) {
+            throw new PlcIncompatibleDatatypeException(BigDecimal.class, index);
+        }
         return new BigDecimal(getValue(index));
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java
index 6fedf24..f911464 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.time.LocalDate;
 
 public class DefaultLocalDateFieldItem extends FieldItem<LocalDate> {
@@ -38,10 +40,10 @@ public class DefaultLocalDateFieldItem extends FieldItem<LocalDate> {
 
     @Override
     public LocalDate getDate(int index) {
-        if (isValidTime(index)) {
-            return getValue(index);
+        if (!isValidTime(index)) {
+            throw new PlcIncompatibleDatatypeException(LocalDate.class, index);
         }
-        return null;
+        return getValue(index);
     }
 
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java
index 8e9d371..c49a03a 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalDateTimeFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -40,10 +42,10 @@ public class DefaultLocalDateTimeFieldItem extends FieldItem<LocalDateTime> {
 
     @Override
     public LocalTime getTime(int index) {
-        if(isValidTime(index)) {
-            return getValue(index).toLocalTime();
+        if (!isValidTime(index)) {
+            throw new PlcIncompatibleDatatypeException(LocalTime.class, index);
         }
-        return null;
+        return getValue(index).toLocalTime();
     }
 
     @Override
@@ -53,10 +55,10 @@ public class DefaultLocalDateTimeFieldItem extends FieldItem<LocalDateTime> {
 
     @Override
     public LocalDate getDate(int index) {
-        if(isValidTime(index)) {
-            return getValue(index).toLocalDate();
+        if (!isValidTime(index)) {
+            throw new PlcIncompatibleDatatypeException(LocalDate.class, index);
         }
-        return null;
+        return getValue(index).toLocalDate();
     }
 
     @Override
@@ -66,10 +68,10 @@ public class DefaultLocalDateTimeFieldItem extends FieldItem<LocalDateTime> {
 
     @Override
     public LocalDateTime getDateTime(int index) {
-        if(isValidTime(index)) {
-            return getValue(index);
+        if (!isValidTime(index)) {
+            throw new PlcIncompatibleDatatypeException(LocalDateTime.class, index);
         }
-        return null;
+        return getValue(index);
     }
 
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java
index fcaf0c7..149b0f8 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLocalTimeFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.time.LocalTime;
 
 public class DefaultLocalTimeFieldItem extends FieldItem<LocalTime> {
@@ -38,10 +40,10 @@ public class DefaultLocalTimeFieldItem extends FieldItem<LocalTime> {
 
     @Override
     public LocalTime getTime(int index) {
-        if (isValidTime(index)) {
-            return getValue(index);
+        if (!isValidTime(index)) {
+            throw new PlcIncompatibleDatatypeException(LocalTime.class, index);
         }
-        return null;
+        return getValue(index);
     }
 
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java
index ff2e5e0..22d36dc 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultLongFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
@@ -39,10 +41,10 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
 
     @Override
     public Boolean getBoolean(int index) {
-        if (isValidBoolean(index)) {
-            return getValue(index) != 0L;
+        if (!isValidBoolean(index)) {
+            throw new PlcIncompatibleDatatypeException(Boolean.class, index);
         }
-        return null;
+        return getValue(index) != 0L;
     }
 
     @Override
@@ -53,10 +55,10 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
 
     @Override
     public Byte getByte(int index) {
-        if (isValidByte(index)) {
-            return getValue(index).byteValue();
+        if (!isValidByte(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
         }
-        return null;
+        return getValue(index).byteValue();
     }
 
     @Override
@@ -67,10 +69,10 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
 
     @Override
     public Short getShort(int index) {
-        if (isValidShort(index)) {
-            return getValue(index).shortValue();
+        if (!isValidShort(index)) {
+            throw new PlcIncompatibleDatatypeException(Short.class, index);
         }
-        return null;
+        return getValue(index).shortValue();
     }
 
     @Override
@@ -81,22 +83,10 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
 
     @Override
     public Integer getInteger(int index) {
-        if (isValidInteger(index)) {
-            return getValue(index).intValue();
-        }
-        return null;
-    }
-
-    public boolean isValidBigInteger(int index) {
-        Long value = getValue(index);
-        return value != null;
-    }
-
-    public BigInteger getBigInteger(int index) {
-        if (isValidBigInteger(index)) {
-            return BigInteger.valueOf(getValue(index));
+        if (!isValidInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(Integer.class, index);
         }
-        return null;
+        return getValue(index).intValue();
     }
 
     @Override
@@ -106,10 +96,22 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
 
     @Override
     public Long getLong(int index) {
-        if (isValidLong(index)) {
-            return getValue(index);
+        if (!isValidLong(index)) {
+            throw new PlcIncompatibleDatatypeException(Long.class, index);
         }
-        return null;
+        return getValue(index);
+    }
+
+    public boolean isValidBigInteger(int index) {
+        Long value = getValue(index);
+        return value != null;
+    }
+
+    public BigInteger getBigInteger(int index) {
+        if (!isValidBigInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
+        }
+        return BigInteger.valueOf(getValue(index));
     }
 
     @Override
@@ -120,10 +122,10 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
 
     @Override
     public Float getFloat(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index).floatValue();
+        if (!isValidFloat(index)) {
+            throw new PlcIncompatibleDatatypeException(Float.class, index);
         }
-        return null;
+        return getValue(index).floatValue();
     }
 
     @Override
@@ -134,10 +136,10 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
 
     @Override
     public Double getDouble(int index) {
-        if (isValidDouble(index)) {
-            return getValue(index).doubleValue();
+        if (!isValidDouble(index)) {
+            throw new PlcIncompatibleDatatypeException(Double.class, index);
         }
-        return null;
+        return getValue(index).doubleValue();
     }
 
     public boolean isValidBigDecimal(int index) {
@@ -145,6 +147,9 @@ public class DefaultLongFieldItem extends FieldItem<Long> {
     }
 
     public BigDecimal getBigDecimal(int index) {
+        if(!isValidBigDecimal(index)) {
+            throw new PlcIncompatibleDatatypeException(BigDecimal.class, index);
+        }
         return new BigDecimal(getValue(index));
     }
 
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java
index a8e9d4e..2c61ad6 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultShortFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 
@@ -39,10 +41,10 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
 
     @Override
     public Boolean getBoolean(int index) {
-        if (isValidBoolean(index)) {
-            return getValue(index) != 0L;
+        if (!isValidBoolean(index)) {
+            throw new PlcIncompatibleDatatypeException(Boolean.class, index);
         }
-        return null;
+        return getValue(index) != 0L;
     }
 
     @Override
@@ -53,10 +55,10 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
 
     @Override
     public Byte getByte(int index) {
-        if (isValidByte(index)) {
-            return getValue(index).byteValue();
+        if (!isValidByte(index)) {
+            throw new PlcIncompatibleDatatypeException(Byte.class, index);
         }
-        return null;
+        return getValue(index).byteValue();
     }
 
     @Override
@@ -67,10 +69,10 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
 
     @Override
     public Short getShort(int index) {
-        if (isValidShort(index)) {
-            return getValue(index);
+        if (!isValidShort(index)) {
+            throw new PlcIncompatibleDatatypeException(Short.class, index);
         }
-        return null;
+        return getValue(index);
     }
 
     @Override
@@ -81,22 +83,10 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
 
     @Override
     public Integer getInteger(int index) {
-        if (isValidInteger(index)) {
-            return getValue(index).intValue();
-        }
-        return null;
-    }
-
-    public boolean isValidBigInteger(int index) {
-        Short value = getValue(index);
-        return value != null;
-    }
-
-    public BigInteger getBigInteger(int index) {
-        if (isValidBigInteger(index)) {
-            return BigInteger.valueOf(getValue(index));
+        if (!isValidInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(Integer.class, index);
         }
-        return null;
+        return getValue(index).intValue();
     }
 
     @Override
@@ -106,10 +96,22 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
 
     @Override
     public Long getLong(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index).longValue();
+        if (!isValidLong(index)) {
+            throw new PlcIncompatibleDatatypeException(Long.class, index);
         }
-        return null;
+        return getValue(index).longValue();
+    }
+
+    public boolean isValidBigInteger(int index) {
+        Short value = getValue(index);
+        return value != null;
+    }
+
+    public BigInteger getBigInteger(int index) {
+        if (!isValidBigInteger(index)) {
+            throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
+        }
+        return BigInteger.valueOf(getValue(index));
     }
 
     @Override
@@ -120,10 +122,10 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
 
     @Override
     public Float getFloat(int index) {
-        if (isValidFloat(index)) {
-            return getValue(index).floatValue();
+        if (!isValidFloat(index)) {
+            throw new PlcIncompatibleDatatypeException(Float.class, index);
         }
-        return null;
+        return getValue(index).floatValue();
     }
 
     @Override
@@ -134,10 +136,10 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
 
     @Override
     public Double getDouble(int index) {
-        if (isValidDouble(index)) {
-            return getValue(index).doubleValue();
+        if (!isValidDouble(index)) {
+            throw new PlcIncompatibleDatatypeException(Double.class, index);
         }
-        return null;
+        return getValue(index).doubleValue();
     }
 
     public boolean isValidBigDecimal(int index) {
@@ -145,6 +147,9 @@ public class DefaultShortFieldItem extends FieldItem<Short> {
     }
 
     public BigDecimal getBigDecimal(int index) {
+        if(!isValidBigDecimal(index)) {
+            throw new PlcIncompatibleDatatypeException(BigDecimal.class, index);
+        }
         return new BigDecimal(getValue(index));
     }
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultStringFieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultStringFieldItem.java
index 395a6c8..d02bbd2 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultStringFieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/DefaultStringFieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 public class DefaultStringFieldItem extends FieldItem<String> {
 
     public DefaultStringFieldItem(String... values) {
@@ -36,10 +38,10 @@ public class DefaultStringFieldItem extends FieldItem<String> {
 
     @Override
     public String getString(int index) {
-        if(isValidString(index)) {
-            return getValue(index);
+        if (!isValidString(index)) {
+            throw new PlcIncompatibleDatatypeException(String.class, index);
         }
-        return null;
+        return getValue(index);
     }
 
 }
diff --git a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
index 7df46a9..14deb18 100644
--- a/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
+++ b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/messages/items/FieldItem.java
@@ -18,6 +18,8 @@ under the License.
 */
 package org.apache.plc4x.java.base.messages.items;
 
+import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDate;
@@ -44,7 +46,7 @@ public abstract class FieldItem<T> {
     }
 
     public Boolean getBoolean(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(Boolean.class, index);
     }
 
     public boolean isValidByte(int index) {
@@ -52,7 +54,7 @@ public abstract class FieldItem<T> {
     }
 
     public Byte getByte(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(Byte.class, index);
     }
 
     public boolean isValidShort(int index) {
@@ -60,7 +62,7 @@ public abstract class FieldItem<T> {
     }
 
     public Short getShort(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(Short.class, index);
     }
 
     public boolean isValidInteger(int index) {
@@ -68,7 +70,7 @@ public abstract class FieldItem<T> {
     }
 
     public Integer getInteger(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(Integer.class, index);
     }
 
     public boolean isValidBigInteger(int index) {
@@ -76,7 +78,7 @@ public abstract class FieldItem<T> {
     }
 
     public BigInteger getBigInteger(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(BigInteger.class, index);
     }
 
     public boolean isValidLong(int index) {
@@ -84,7 +86,7 @@ public abstract class FieldItem<T> {
     }
 
     public Long getLong(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(Long.class, index);
     }
 
     public boolean isValidFloat(int index) {
@@ -92,7 +94,7 @@ public abstract class FieldItem<T> {
     }
 
     public Float getFloat(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(Float.class, index);
     }
 
     public boolean isValidDouble(int index) {
@@ -100,7 +102,7 @@ public abstract class FieldItem<T> {
     }
 
     public Double getDouble(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(Double.class, index);
     }
 
     public boolean isValidBigDecimal(int index) {
@@ -108,7 +110,7 @@ public abstract class FieldItem<T> {
     }
 
     public BigDecimal getBigDecimal(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(BigDecimal.class, index);
     }
 
     public boolean isValidString(int index) {
@@ -116,7 +118,7 @@ public abstract class FieldItem<T> {
     }
 
     public String getString(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(String.class, index);
     }
 
     public boolean isValidTime(int index) {
@@ -124,7 +126,7 @@ public abstract class FieldItem<T> {
     }
 
     public LocalTime getTime(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(LocalTime.class, index);
     }
 
     public boolean isValidDate(int index) {
@@ -132,7 +134,7 @@ public abstract class FieldItem<T> {
     }
 
     public LocalDate getDate(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(LocalDate.class, index);
     }
 
     public boolean isValidDateTime(int index) {
@@ -140,7 +142,7 @@ public abstract class FieldItem<T> {
     }
 
     public LocalDateTime getDateTime(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(LocalDateTime.class, index);
     }
 
     public boolean isValidByteArray(int index) {
@@ -148,7 +150,7 @@ public abstract class FieldItem<T> {
     }
 
     public Byte[] getByteArray(int index) {
-        return null;
+        throw new PlcIncompatibleDatatypeException(Byte[].class, index);
     }
 
     public T[] getValues() {
@@ -186,5 +188,4 @@ public abstract class FieldItem<T> {
             '}';
     }
 
-    //ToDo Replace returning of null by Exceptions
 }