NullPointerException выдается при запуске программы, но не в режиме отладки Java jssc Связь через последовательный порт - PullRequest
1 голос
/ 03 октября 2019

Я впервые за последние несколько лет коснулся Java. Мне было поручено создать исполняемый файл Jar, который будет вызываться для связи с устройством считывания карт RFID. Теперь мой код прекрасно работает в режиме отладки, однако, когда я просто пытаюсь запустить программу, я получаю исключение NullPointerException. Извините, если ответ очевиден, но прошло некоторое время с тех пор, как я коснулся Java.

Я использую Eclipse IDE (2019)

Любая помощь будет наиболее ценной

    package rfid;

import jssc.SerialPort;
import jssc.SerialPortException;
import jssc.SerialPortList;

import java.math.BigInteger;
import java.util.Arrays;
import java.util.Formatter;

import javax.xml.bind.DatatypeConverter;

public class RFID_TEST {

    public static byte[] hexStringToByteArray(String s) {
        int len = s.length();
        byte[] data = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                                 + Character.digit(s.charAt(i+1), 16));
        }// for
        return data;
    } // hexStringToByteArray

    public static String[] reverse(String[] nums) {
        String[] reversed = new String[nums.length];
        for (int i=0; i<nums.length; i++) {
            reversed[i] = nums[nums.length - 1 - i];
        }
        return reversed;
    }

    static String byteToHex(final byte[] hash)
    {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }

    public static void main (String[] args) {

        String[] portNames = SerialPortList.getPortNames();
        for(int i = 0; i < portNames.length; i++) {
            System.out.println(portNames[i]);
        }

         String portReader2 = "";

        SerialPort serialPort = new SerialPort("COM4");
        try {
            serialPort.openPort();//Open serial port
            serialPort.setParams(38400,8,1,0);

            byte[] bytesToSend = new byte[] {};
            bytesToSend = hexStringToByteArray("020008010000020001aa550000b463");
            serialPort.writeBytes(bytesToSend);//Write data to port
            byte[] portReader =  new byte[] {};
            portReader = serialPort.readBytes();// read response
            //portReader2 = DatatypeConverter.printHexBinary(portReader);
            portReader2 = byteToHex(portReader);
            System.out.println(portReader2);
            String portReader3 = portReader2.substring(22, 36);
            System.out.println(portReader3);

            String[] array= portReader3.split("(?<=\\G.{2})");
            System.out.println(java.util.Arrays.toString(array));

            String[] finalArray = reverse(array);

            String str="";
            for(int i=0;i<finalArray.length;i++)
                str+=finalArray[i];

            String finalOne = str.replaceAll("\\s+","");

            BigInteger hex = new BigInteger(finalOne, 16);
            System.out.println(hex);

            serialPort.closePort();//Close serial port
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }


    }

}

Однако при выходе из режима отладки я получаю следующее исключение NullPointerException

COM3
COM4
Exception in thread "main" java.lang.NullPointerException
    at rfid.RFID_TEST.byteToHex(RFID_TEST.java:36)
    at rfid.RFID_TEST.main(RFID_TEST.java:65)

1 Ответ

1 голос
/ 03 октября 2019

Я решил проблему (по указанию mwarren), отредактировав переменную portReader в следующем коде:

try {
    portReader = serialPort.readBytes(28,100);
} catch (SerialPortTimeoutException e) {
    e.printStackTrace();
}// read response
...