Как я могу разрешить эту ArrayIndexOutOfBoundsException, которая работает на одном компьютере, но не на другом? - PullRequest
0 голосов
/ 17 марта 2019

Так что я в растерянности, как это сделать.

Я использую Eclipse в качестве своей IDE и экспортирую через него работающий флягу.Все работало раньше, за исключением того, что у меня есть ComboBox и я загружаю его массивом (FX.Collections-thing).Я запускаю его на своем компьютере с Windows 7, где я занимаюсь разработкой, а затем перенесу его на свой компьютер с Windows 10, где я проверяю, чтобы убедиться, что все работает нормально, но это не так.

OutOfBoundsExceptionОбычно с ними просто иметь дело, но я не знаю, как справиться с этим исключением, так как оно работает на одном компьютере (исключений времени выполнения нет), а на другом есть следующие исключения:

Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$159(LauncherImpl.java:182)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:89)
at my.pages.giftcertmaker.MainGiftCertPage.start(MainGiftCertPage.java:52)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$166(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$179(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$177(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$178(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$152(WinApplication.java:177)
... 1 more
Exception running application my.pages.giftcertmaker.MainGiftCertPage

Редактировать: Извините, что не выполняю мою должную осмотрительность. Ниже приведены строки 51 и 52

ArrayList<Integer> certNumbersFound = workbook.getCertNumbers();
int lastNumber = certNumbersFound.get(certNumbersFound.size()-1);

.пробовал 4 разных версии Java (1.8.0_181, _192, _201, _202).Я попытался изменить двойные типы, прочитанные из файла Excel в разных частях кода.Я попытался изменить тип ArrayList с, и.Я изменил расположение загруженного кода.Это всегда относится к этой части:

certNumbersFound.get(certNumbersFound.size()-1)

Я всегда думал, что это нормально, но как лучше?Или мне просто не повезло?И я также System.out.println-ed ArrayList перед методом launch (args) в main и сделал certNumbersFound.size () - 1 в своем собственном объекте перед помещением в метод get ArrayList.

И все библиотеки работали ранее, но добавление этого ComboBox и ArrayList (скорее, FX.Collections-вещь) разрушает его.

Я действительно ошеломлен.

Ответы [ 2 ]

2 голосов
/ 18 марта 2019

ArrayList.get выдает IndexOutOfBoundsException, если индекс выходит за пределы диапазона. В вашем случае, вероятно, меньше нуля.

Чтобы избежать этого, добавьте проверку к своему коду:

ArrayList<Integer> certNumbersFound = workbook.getCertNumbers();
if (certNumbersFound.size() >= 1) {
    int lastNumber = certNumbersFound.get(certNumbersFound.size()-1);
    //more code
}
else {
    //handle situation according to your needs
    //e.g. throw exception, log something or write to err: 
    System.err.println("Invalid size: " + certNumbersFound.size());
}

При чтении данных из внешних источников (в данном случае, например, файла Excel) всегда полезно вводить проверки безопасности.

Еще лучшая идея - поместить обработку исключений (или: ожидать неожиданный код обработки ) внутри getCertNumbers, который является методом, в котором вы читаете (потенциально ненадежный) внешний источник. Внешний источник в этом контексте означает: не контролируется компилятором Java.

0 голосов
/ 19 марта 2019

Благодарю JB Nizet за помощь в работе над этим.

У меня были проверки, если файла не было, будет создан новый файл с соответствующим шаблоном в качестве избыточности.Но!Это не значит, что в шаблоне есть какие-либо значения для загрузки ArrayList.

Единственная причина, по которой он работал на моем компьютере с Windows 7 (компьютер для разработки), заключалась в том, что у него был тестовый файл с уже имеющимися в шаблоне фигурами, поэтому он никогда не запускался с нуля, как это было на моем Windows 10.(тестирование компьютера).

Я должен добавить метод или оператор if, говорящий:

if(certNumbersFound != null && certNumbersFound.size() > 0)
{
  //Write code that can use the ArrayList certNumbersFound
  //because there's values in the file
}
else
{
  //Write code that doesn't use the ArrayList certNumbersFound
  //because there's no values in the file.
}

Я чувствую себя настолько глупым.Спасибо всем.Я извиняюсь за трату вашего времени.

...