如何解决在一台计算机上有效但在另一台计算机上无效的 ArrayIndexOutOfBoundsException?
How can I resolve this ArrayIndexOutOfBoundsException that works on one computer but not on another?
所以我不知道该怎么做。
我正在使用 Eclipse 作为我的 IDE 并通过它导出一个 运行nable jar。之前一切正常,除了现在我有一个 ComboBox 并用数组加载它(FX.Collections-thing)。我 运行 它在我的 Windows 7 计算机上进行开发,然后我将它移到我的 Windows 10 计算机上进行测试以确保事情 运行 没问题,但在这种情况下不是。
OutOfBoundsException 通常很容易处理,但我不知道如何处理这个异常,因为它在一台计算机上工作(没有 运行time 异常)而在另一台计算机上有此异常:
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$launchApplication9(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$launchApplication16(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait9(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null7(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater8(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$null2(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 文件读取的双精度类型。我已经尝试将 ArrayList 的类型从 、 和 更改为。我正在更改加载代码的位置。它总是转到这部分:
certNumbersFound.get(certNumbersFound.size()-1)
我一直认为这样可以,但是有什么更好的方法吗?还是我只是运气不好?而且我还在 main 中的 launch(args) 方法之前 System.out.println-ed ArrayList,并在放入 ArrayList 的 get 方法之前将 certNumbersFound.size()-1 放入它自己的对象中。
所有的库以前都可以工作,但是添加这个 ComboBox 和 ArrayList(而不是 FX.Collections-thing)会破坏它。
我真的傻眼了。
如果索引超出范围,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 编译器控制。
感谢 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.
}
我觉得很蠢。感谢大家。很抱歉浪费你的时间。
所以我不知道该怎么做。
我正在使用 Eclipse 作为我的 IDE 并通过它导出一个 运行nable jar。之前一切正常,除了现在我有一个 ComboBox 并用数组加载它(FX.Collections-thing)。我 运行 它在我的 Windows 7 计算机上进行开发,然后我将它移到我的 Windows 10 计算机上进行测试以确保事情 运行 没问题,但在这种情况下不是。
OutOfBoundsException 通常很容易处理,但我不知道如何处理这个异常,因为它在一台计算机上工作(没有 运行time 异常)而在另一台计算机上有此异常:
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$launchApplication9(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$launchApplication16(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait9(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null7(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater8(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$null2(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 文件读取的双精度类型。我已经尝试将 ArrayList 的类型从 、 和 更改为。我正在更改加载代码的位置。它总是转到这部分:
certNumbersFound.get(certNumbersFound.size()-1)
我一直认为这样可以,但是有什么更好的方法吗?还是我只是运气不好?而且我还在 main 中的 launch(args) 方法之前 System.out.println-ed ArrayList,并在放入 ArrayList 的 get 方法之前将 certNumbersFound.size()-1 放入它自己的对象中。
所有的库以前都可以工作,但是添加这个 ComboBox 和 ArrayList(而不是 FX.Collections-thing)会破坏它。
我真的傻眼了。
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 编译器控制。
感谢 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.
}
我觉得很蠢。感谢大家。很抱歉浪费你的时间。