1

私は次のコードを持っています:

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

画像ファイルのパスと関係があることは知っていますが、その理由はわかりません。この方法でパスを決定するサイトの例を見つけましたが、うまくいきました...助けていただければ幸いです^^

4

1 に答える 1

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

ですので、 aNullPointerExceptionがスローされ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));
...

Java で配列ではなくリストを使用することが好まれるのはなぜですか?も参照してください。

于 2013-08-02T12:49:16.447 に答える