我有以下代码:
package imagebrowser;
import java.io.File;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
/**
*
* @author Dess
*/
public class ImageBrowser extends Application {
Image[] images;
ImageView[] imagesView;
@Override
public void start(Stage primaryStage) {
StackPane root = new StackPane();
Scene scene = new Scene(root, 600, 450);
int j = 0;
String path = "C://imbr/";
String files;
File folder = new File(path);
File[] listOfFiles = folder.listFiles();
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].getName().endsWith("jpg") || listOfFiles[i].getName().endsWith("JPG")) {
System.out.println(listOfFiles[i].getAbsolutePath());
files = "file:" + listOfFiles[i].getAbsolutePath();
System.out.println(files);
images[j] = new Image(files, 200, 200, true, true);
imagesView[j] = new ImageView();
imagesView[j].setImage(images[j]);
j++;
}
}
primaryStage.setTitle("Przegladarka Obrazkow");
primaryStage.setScene(scene);
for(int i = 0; i < imagesView.length; i++){
root.getChildren().add(imagesView[i]);
}
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
不起作用:
Executing com.javafx.main.Main from C:\Users\Dess\Documents\NetBeansProjects\ImageBrowser\dist\run1928942616\ImageBrowser.jar using platform C:\Program Files\Java\jdk1.7.0_17/bin/java
C:\imbr\1.jpg
file:C:\imbr\1.jpg
Exception in Application start method
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.javafx.main.Main.launchApp(Main.java:642)
at com.javafx.main.Main.main(Main.java:805)
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:403)
at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:47)
at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:115)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.NullPointerException
at imagebrowser.ImageBrowser.start(ImageBrowser.java:49)
at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:215)
at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:179)
at com.sun.javafx.application.PlatformImpl$4$1.run(PlatformImpl.java:176)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:176)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
... 1 more
Java Result: 1
我知道它与图像文件的路径有关,但我不知道为什么。 我已经在网站上找到了这种确定路径的方法的例子,并且它有效... 我会帮助^^
答案 0 :(得分:1)
原因是java.lang.NullPointerException
,因为您尚未初始化数组变量:
Image[] images; // images is null
ImageView[] imageViews; // imageViews is also null
访问images
时
images[j] = new Image(files, 200, 200, true, true);
由于NullPointerException
为images
而被引发null
。
要使其工作,您需要创建一个相应的数组对象,如
Image[] images = new Image[100]; // now images is a reference to an array of 100 elements
但是,我强烈建议你不要使用普通数组 - 你不知道要提前加载的图像数量(你知道最大值,所以你仍然可以分配一个足够大的数组来保存最大数量的图像,但这可能会浪费内存),所以请使用类似ArrayList:
的内容List<Image> images = new ArrayList<>();
...
images.add(new Image(files, 200, 200, true, true));
...
另见Why is it preferred to use Lists instead of Arrays in Java?