Try/Catch 没有从 JavaFX 中的 URL 捕获我的空图像异常

Try/Catch isn't catching my null Image exception from URL in JavaFX

好的,我在 SceneBuilder 中分配了一个 Circle 组件。我想用一个 ImagePattern 对象填充这个 Circle,但是我 运行 遇到了一个奇怪的问题。我正在从数据库中的许多 URL 中分配大量图像,它们仅在我单击它们时设置,并且一些 link 似乎已损坏,但对于某些原因是我无法使用 try/catch.

阻止我的程序崩溃

以下是 links 的工作示例:

https://a0.muscache.com/im/users/67564/profile_pic/1320663729/original.jpg?aki_policy=profile_x_medium

https://a0.muscache.com/im/users/168920/profile_pic/1279390466/original.jpg?aki_policy=profile_x_medium

https://a0.muscache.com/im/users/502496/profile_pic/1385405597/original.jpg?aki_policy=profile_x_medium

这是一个 link 的例子,它使我的程序崩溃:

https://a0.muscache.com/im/pictures/c5b5bc4e-0133-4103-b68e-66f33bbf9e27.jpg?aki_policy=profile_x_medium

如您所见,link 指向 Null 目录,我在控制台中收到此错误:

Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Image must be non-null

所以我假设我可以用一个简单的 try/catch 来解决这个问题,所以我做了以下事情:

    try {
        circle.setFill(new ImagePattern(new Image("https://a0.muscache.com/im/pictures/c5b5bc4e-0133-4103-b68e-66f33bbf9e27.jpg?aki_policy=profile_x_medium")));
    }
    catch (Exception e){
        e.printStackTrace();
    }

还有 nada,它没有发现我的错误。我试过使用正确的 IllegalArgumentException 捕获,我试过忽略捕获,没有区别。

我在下面对我的问题做了一个小复原,错误仍然很普遍:

public class Test extends Application {

    @Override
    public void start(Stage stage){

BorderPane root = new BorderPane();
        Circle circle = new Circle(50);
        root.setCenter(circle);

        // Works fine (Working link)
        //circle.setFill(new ImagePattern(new Image("https://a0.muscache.com/im/users/67564/profile_pic/1320663729/original.jpg?aki_policy=profile_x_medium")));

        // Dies and cries (Broken link)
        try {
            circle.setFill(new ImagePattern(new Image("https://a0.muscache.com/im/pictures/c5b5bc4e-0133-4103-b68e-66f33bbf9e27.jpg?aki_policy=profile_x_medium")));
        }
        catch (Exception e){
            e.printStackTrace();
        }

        scene = new Scene(root);
        stage.setTitle("test");
        stage.setScene(scene);
        stage.show();

}

}

只是为了确认我的目标是什么,我只想让我的程序在 link 无效时完全忽略这一行,我该怎么做?谢谢。

此外,如果有人对我为什么要加载一个死的 link 感到困惑,正如我之前所说,我正在从数据库加载图像,所以我不知道哪个 link 的工作,哪些不工作,我不知道如何检查和研究似乎只是告诉我使用 try/catch。

没关系,我找到了修复方法,Image 中有一个方法可以检查是否有错误:

image.isError()