我该如何解决在一台计算机上运行但不在另一台计算机上运行的ArrayIndexOutOfBoundsException?

时间:2019-03-17 15:44:51

标签: java windows-10 indexoutofboundsexception windows-7-x64

所以我对此无所适从。

我将Eclipse用作IDE,并通过它导出可运行的jar。除了现在我有一个ComboBox并用数组(FX.Collections-thing)加载它以外,其他所有东西都工作了。我在我进行开发的Windows 7计算机上运行它,然后将其移至我进行测试以确保一切正常的Windows 10计算机上,但是在这种情况下不是这样。

OutOfBoundsException通常很容易处理,但是我对如何处理该异常感到困惑,因为它可以在一台计算机上运行(没有运行时异常),而在另一台计算机上则存在以下异常:< / p>

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);

哪个问题叫什么getCertNumbers()

public ArrayList<Integer> getCertNumbers()
{
  ArrayList<Integer> numbersUsed = new ArrayList<Integer>();
 /*
  * Code reads from an excel file column of doubles and converts
  * the doubles to ints and adds them to numbersUsed with a for-loop
  */
  return numbersUsed;

我尝试了4种不同的Java版本(1.8.0_181,_192,_201,_202)。我试过更改代码不同部分从excel文件读取的double类型。我尝试从,和更改ArrayList的类型。我已经更改了加载代码的位置。它总是到这部分:

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

我一直以为这可以,但是还有什么更好的方法?还是我只是倒霉?而且我还已经System.out.println-在主数组中的launch(args)方法之前添加了ArrayList,并在将ArrayNumbersFound.size()-1放入其自己的对象之前,将其放入ArrayList的get方法中。

所有库以前都可以使用,但是添加此ComboBox和ArrayList(而不是FX.Collections之类的东西)会破坏它。

我真的很傻。

2 个答案:

答案 0 :(得分:2)

如果索引超出范围,则

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编译器的控制。

答案 1 :(得分:0)

感谢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.
}

我觉得好蠢。感谢大家。很抱歉浪费您的时间。