Understanding Javafx runtime errors [duplicate]

一世执手 提交于 2021-01-28 09:01:30

问题


I wrote code for Sokoban game by using JavaFX but not completed one, here has three parts, first initialization, two more functions as you see. When I run the program, it makes a bunch of errors and it is the first time for me to get such java errors, I think this is not a syntax error, please give me your feedback if you know how to solve this, thanks.

public class Main extends Application {
    private double width = 32*20;
    private double height = 32*20;
    private int[][] grid;
    private int[][] targets;
    private Image image = new Image("man.png");
    private ImageView man = new ImageView(image);
    private ArrayList<ImageView> boxList = new ArrayList<ImageView>();
    private Pane warehouse;

    public void warehouseInitialize(){
        warehouse.getChildren().clear();

        int[][] tempGrid = {     {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
                                {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,2,0,0,1,1,1,1,1,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
                                {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
        this.grid = tempGrid;
        int [][] tempTargets = {{3,3},{18,18},{16,5}};
        this.targets = tempTargets;
        warehouse.setStyle("-fx-background-color:green");

        for(int row=0;row<20;row++){
            for(int col=0;col<20;col++){
                if(grid[row][col] == 1){
                    ImageView stone = new ImageView(new Image("stone.png"));
                    stone.setX(row*32);
                    stone.setY(col*32);
                    warehouse.getChildren().add(stone);
                }else if(grid[row][col] == 2){
                    ImageView box = new ImageView(new Image("box.png"));
                    box.setX(row*32);
                    box.setY(col*32);
                    warehouse.getChildren().add(box);
                    boxList.add(box);
                }
            }
        }

        man.setX(10*32);
        man.setY(10*32);
        warehouse.getChildren().add(man);

        for(int i=0;i<targets.length;i++){
            Circle circle = new Circle();
            circle.setRadius(16);
            circle.setCenterX(tempTargets[i][i] * 32);
            circle.setCenterY(tempTargets[i][i+1]*32);
            circle.setStyle("-fx-stroke:red; -fx-fill:blue;");
            warehouse.getChildren().add(circle);
        }
    }
    @Override
    public void start(Stage primaryStage)throws Exception{
        MenuBar menuBar = new MenuBar();
        Menu menu1 = new Menu("Tool");
        menuBar.getMenus().add(menu1);
        MenuItem menu12 = new MenuItem("Reset");
        menu1.getItems().add(menu12);
        menu12.setOnAction(e->{
            warehouseInitialize();
        });
        primaryStage.setTitle("Sokoban");
        primaryStage.setWidth(width);
        primaryStage.setHeight(height + menuBar.getHeight() + 64);
        primaryStage.setResizable(false);

        VBox vBox = new VBox(menuBar,warehouse);

        Scene scene = new Scene(vBox,800,800);
        scene.setOnKeyPressed(e->{
            switch(e.getCode()){
                /*case UP:
                    //goUp();
                    break;
                case DOWN:
                    //goDown();
                    break;
                case RIGHT:
                    //goRight();
                    break;*/
                case LEFT:
                    goLeft();
                    break;
            }
        });
    }
  public void goLeft(){
        int left1 = (int)((man.getX() - 32) / 32);
        int left2 = (int)((man.getX() - 64) / 32);
        int y = (int)(man.getY() / 32);
        if(grid[y][left1] == 0){
            man.setX(left1*32);
            man.setY(y*32);
        }else if(grid[y][left1] == 2 && grid[y][left2]==0){
            man.setX(left1*32);
            man.setY(y*32);
            for(ImageView box :boxList){
                int x_b = (int)(box.getX() / 32);
                int y_b = (int)(box.getY() / 32);
                if(x_b == y && y_b == left2 + 1){
                    box.setX(y*32);
                    box.setY(left2 * 32);
             }
         }
     }
  }
}

Here some errors when I run the program:

Exception in Application constructor
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)atcom.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class sample.Main
    at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:907)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$154(LauncherImpl.java:182)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$160(LauncherImpl.java:819)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
... 1 more
Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found
    at javafx.scene.image.Image.validateUrl(Image.java:1118)
    at javafx.scene.image.Image.<init>(Image.java:620)
    at sample.Main.<init>(Main.java:24)
... 13 more
Caused by: java.lang.IllegalArgumentException: Invalid URL or resource not found
    at javafx.scene.image.Image.validateUrl(Image.java:1110)
... 15 more
Exception running application sample.Main

回答1:


The error is due to wrong image path. To test you code you can use a web resource :

        Image image = new Image("https://candytech.in/wp-content/uploads/2018/04/man-1.png");
        ImageView man = new ImageView(image);

The posted code private Image image = new Image("man.png"); should work when man.png is in the same folder as Main.
Not related to the question: warehouse is never initialized.




回答2:


The stacktrace is quite detailed and gives enough information to debug. You could see a sequence of caused by which means the upper exception is caused by the exception below it.

So it's most likelt that your image can't be found at your specified location. Please recheck it and consider checking something about relative path.




回答3:


The error is:

Caused by: java.lang.IllegalArgumentException: Invalid URL: Invalid URL or resource not found

And the point in your code is here:

at sample.Main.<init>(Main.java:24)

Which if I am correct, refers to this line:

private Image image = new Image("man.png");

The problem is that man.png can not be found. However, according to this question there are two possible workarounds. First, try this:

private Image image = new Image("/sample/man.png");

By default, the root for Image is the src directory.

If that fails, this might work:

private File file = new File("C:\\Users\\Yusuf\\Desktop\\Foundation of Multimedia\\lab\\Sokoban\\src\\sample\\man.png");
private Image image = new Image(file.toURI().toString());

Here we create a File object that points to the required file then use toURI() to get a URI. You might be able to skip the File object by using:

private Image image = new Image("file://C/Users/Yusuf/Desktop/Foundation of Multimedia/lab/Sokoban/src/sample/man.png");

However, there might be issues with escaping space characters, etc, so it's probably easier to use the intermediate File object.



来源:https://stackoverflow.com/questions/53926961/understanding-javafx-runtime-errors

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!