【问题标题】:Why am I getting an "exception while running" error? [duplicate]为什么我会收到“运行时出现异常”错误? [复制]
【发布时间】:2015-04-06 03:17:51
【问题描述】:

我制作了一组图像,以设置较少的图像视图。我想要 10 个图像随机分配给 4 个图像视图,然后通过网格窗格显示。每次运行代码时都会出现错误,“运行应用程序时出现异常”。是图片的路径吗?我没有看到任何明显的错误。

package Flag;
 import java.util.Random;
 import javafx.application.Application;
 import javafx.geometry.Pos;
 import javafx.scene.Scene; 
 import javafx.scene.image.Image;
 import javafx.scene.image.ImageView;
 import javafx.scene.layout.GridPane;
 import javafx.stage.Stage; 

 public class Flag extends Application {

     @Override public void start(Stage primaryStage) {
         // Initialize Variables
         GridPane pane = new GridPane();
         pane.setAlignment(Pos.CENTER);
         ImageView [] imv = new ImageView [4];
         Image [] images = new Image[10];

         //Fill Images array
         images[0] = new Image(Flag.class.getResourceAsStream("images/flag0.gif"));
         images[1] = new Image(Flag.class.getResourceAsStream("images/flag1.gif"));    
         images[2] = new Image(Flag.class.getResourceAsStream("images/flag2.gif"));
         images[3] = new Image(Flag.class.getResourceAsStream("images/flag3.gif"));
         images[4] = new Image(Flag.class.getResourceAsStream("images/flag4.gif"));
         images[5] = new Image(Flags.class.getResourceAsStream("images/flag5.gif"));    
         images[6] = new Image(Flag.class.getResourceAsStream("images/flag6.gif"));
         images[7] = new Image(Flag.class.getResourceAsStream("images/flag7.gif"));
         images[8] = new Image(Flags.class.getResourceAsStream("images/flag8.gif"));
         images[9] = new Image(Flags.class.getResourceAsStream("images/flag9.gif"));

          //Random number
        Random rand = new Random();

         //Give Each Image an Image View
         for (ImageView imv1 : imv) {
/*This is line 38*/  imv1.setImage(images[rand.nextInt(9)]);
         } 

      // Add nodes to pane
         pane.add(imv[0], 0, 0);
         pane.add(imv[1], 0, 1);
         pane.add(imv[2], 1, 0);
         pane.add(imv[3], 1, 1);

     //Create a scene and place it in the stage
        Scene scene = new Scene(pane);
        primaryStage.setTitle("ShowGridPane");
        primaryStage.setScene(scene);
        primaryStage.show();
     }

     public static void main(String[] args) {
         Application.launch(args);
     }
 }

这是日志

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:606)
    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:724)
Caused by: java.lang.NullPointerException
    at Flag.Flag.start(FlagsHwB.java:38)
    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

【问题讨论】:

  • 38 行是什么?

标签: image javafx imageview gridpane


【解决方案1】:

images[9] - 这不存在。该数组只有九个元素。错误消息是这样写的:Caused by: java.lang.ArrayIndexOutOfBoundsException: 9

【讨论】:

    【解决方案2】:

    问题是因为

    Image [] images = new Image[9];
    

    您正在初始化一个包含 9 个元素的数组并尝试向其中插入 10 个元素。

    images[9] = new Image(Flags.class.getResourceAsStream("images/flag9.gif"));
    

    代表9th index10th element。只需将数组大小增加到10

    Image [] images = new Image[10];
    

    如果您不确定数组的大小,更好的选择是使用ArrayList 。 ArrayList 在添加元素时自行调整大小。

    编辑 - 根据用户 cmets

    NullPointerException 是因为您还没有初始化任何 ImageView。在使用 ImageView 之前对其进行初始化。

    for (ImageView imv1 : imv) {
        imv1 = new ImageView(); // Initialization
        imv1.setImage(images[rand.nextInt(9)]);
    } 
    

    也可以直接使用

    for (ImageView imv1 : imv) {
        imv1 = new ImageView(images[rand.nextInt(9)]));
    } 
    

    【讨论】:

    • 将数组更改为“Image [] images = new Image[10];”仍然得到同样的错误。稍后将尝试使用数组列表,看看效果如何。我将编辑帖子并放置新日志。
    • 错误不一样,你收到一个 Nullpointer 异常。请添加第 38 行的内容。
    • 好的,第 38 行现在被标记了。
    • 已更新,可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2010-09-15
    • 2021-07-12
    相关资源
    最近更新 更多