Reputation: 435
I have following code:
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);
}
}
which does not work:
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
I know it has something to do with path of the image file, but I have no idea why. I have found examples on sites with this way of determining the path and it worked... I would apreciate some help^^
Upvotes: 1
Views: 3867
Reputation: 36630
The reason is a java.lang.NullPointerException
because you have not initialized your array variables:
Image[] images; // images is null
ImageView[] imageViews; // imageViews is also null
When accessing images
like
images[j] = new Image(files, 200, 200, true, true);
a NullPointerException
is thrown because images
is null
.
To make this work, you need to create a corresponding array object, like
Image[] images = new Image[100]; // now images is a reference to an array of 100 elements
However, I strongly discourage you to use a plain array for this - you do not know the number of images you want to load in advance (you know the maximum though, so you could still allocate an array large enough to hold the maximum number of images, but that might waste memory), so use something like an ArrayList:
List<Image> images = new ArrayList<>();
...
images.add(new Image(files, 200, 200, true, true));
...
See also Why is it preferred to use Lists instead of Arrays in Java?
Upvotes: 1