Как решить исключение NumberFormatException?

Я новичок в Java, так что терпите меня... Я пытаюсь записать данные из CSV-файла в базу данных Access, используя библиотеку Jackcess. Первая строка CSV-файла отлично записывается в базу данных, но начиная со второй строки она продолжает вызывать исключение NumberFormatException. Вот код:

public void GPXtoAccess() {
    try {
        Access = new Scanner(DummyCSV);
        Access.useDelimiter(";");
        while(Access.hasNextLine()) {
            GPXlat = Access.next();
            GPXlon = Access.next();
            GPXtime = Access.next();
            GPXname = Access.next();
            GPXdesc = Access.next();

            try {
                GPXTable.addRow(Column.AUTO_NUMBER, GPXlat, GPXlon, GPXtime, GPXname, GPXdesc);
            } catch (IOException E) {
                System.out.println("Error: " + E);
                System.out.println("Error is thrown while writing data to table");
            }
        }
    } catch (FileNotFoundException ex) {
        System.out.println("Error: " + ex);
    }
}

Он продолжает вызывать исключение NumberFormatException:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "2016-11-28T11:36:34"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at java.lang.Double.valueOf(Double.java:502)
at com.healthmarketscience.jackcess.impl.ColumnImpl.toNumber(ColumnImpl.java:1443)
at com.healthmarketscience.jackcess.impl.ColumnImpl.writeFixedLengthField(ColumnImpl.java:1105)
at com.healthmarketscience.jackcess.impl.ColumnImpl.writeFixedLengthField(ColumnImpl.java:1072)
at com.healthmarketscience.jackcess.impl.ColumnImpl.writeRealData(ColumnImpl.java:1029)
at com.healthmarketscience.jackcess.impl.ColumnImpl.write(ColumnImpl.java:1021)
at com.healthmarketscience.jackcess.impl.ColumnImpl.write(ColumnImpl.java:1003)
at com.healthmarketscience.jackcess.impl.TableImpl.createRow(TableImpl.java:2708)
at com.healthmarketscience.jackcess.impl.TableImpl.createRow(TableImpl.java:2660)
at com.healthmarketscience.jackcess.impl.TableImpl.addRows(TableImpl.java:2193)
at com.healthmarketscience.jackcess.impl.TableImpl.addRow(TableImpl.java:2086)
at GPX.GPX_Parser.GPXtoAccess(GPX_Parser.java:196)
at GPX.GUI.GPX_Handle.btnExportDatabaseActionPerformed(GPX_Handle.java:234)
at GPX.GUI.GPX_Handle.access$300(GPX_Handle.java:21)
at GPX.GUI.GPX_Handle$4.actionPerformed(GPX_Handle.java:111)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4525)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

person HaroldFinch    schedule 19.12.2017    source источник
comment
Вы пытаетесь сохранить дату как число в своей базе данных. Решение: не надо. Ваша база данных не синхронизирована с вашими данными.   -  person user207421    schedule 20.12.2017
comment
И пожалуйста используйте стандартные соглашения об именах Java. Имена локальных переменных и полей, которые не являются static или не final, должны начинаться со строчной буквы (и в целом должны быть написаны в camelCase). Это облегчает чтение другим и даже влияет на автоматическую подсветку кода.   -  person John Bollinger    schedule 20.12.2017


Ответы (2)


Я считаю, что здесь происходит то, что ваш GPXTime не соответствует стандартам базы данных Access, поэтому он не знает, как с этим бороться. Возможно, вы захотите взглянуть на API и посмотреть, какой формат он принимает, а затем вы выполняете преобразование из вашего CSV-файла, имеющего формат «2016-11-28T11:36:34», в любой формат, который принимает база данных Access. Попробуйте преобразовать даты в миллисекунды перед вызовом addRow().

person Juan Acevedo    schedule 19.12.2017

Не беспокойтесь, мы все начинали с ограниченными знаниями.

Я начну с отзыва о вашем коде:

1) у вас, похоже, много переменных-членов, возможно, даже статических. Например, переменная Access. Нет причин делать do, если вы используете его только в той области, которой вы поделились с нами, то есть в этом методе.

2) соглашение об именах Java: я настоятельно рекомендую вам следовать соглашениям об именах Java, как описано здесь: http://www.oracle.com/technetwork/java/codeconventions-135099.html Соблюдение этих соглашений об именах делает код более читаемым для других людей, например. мы, здесь

3) перед получением next() вы должны использовать hasNext(), чтобы убедиться, что токен действительно доступен. Я рекомендую вам попытаться отладить и исправить проблему, выполнив следующие действия:

while (Access.hasNext()) {
    System.out.println(Access.next());
}

Посмотрите, как это происходит.

person Johan Witters    schedule 19.12.2017