first of all, I'm a complete begginer in Java and JavaFX, using IntelliJ Idea for that. I have tried to download and run a piece of game's code but ran into a problem that I can't pinpoint the cause of.
I have this in my VM options:
--module-path
${PATH_TO_FX};${OUTPUT}
--add-modules
javafx.controls,javafx.fxml
Error message itself:
Exception in Application constructor
java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:465)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:364)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1071)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class gg.game.Game
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:891)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$8(LauncherImpl.java:803)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
... 1 more
Caused by: java.lang.NullPointerException: Input stream must not be null
at javafx.graphics/javafx.scene.image.Image.validateInputStream(Image.java:1142)
at javafx.graphics/javafx.scene.image.Image.<init>(Image.java:705)
at gg.game/gg.game.Game.<init>(Game.java:19)
... 14 more
Exception running application gg.game.Game
Game's code:
package gg.game;
import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.HashMap;
public class Game extends Application {
public static ArrayList<Block> platforms = new ArrayList<>();
private HashMap<KeyCode,Boolean> keys = new HashMap<>();
Image backgroundImg = new Image(getClass().getResourceAsStream("background.png"));
public static final int BLOCK_SIZE = 45;
public static final int MARIO_SIZE = 40;
public static Pane appRoot = new Pane();
public static Pane gameRoot = new Pane();
public Character player;
int levelNumber = 0;
private int levelWidth;
private void initContent(){
ImageView backgroundIV = new ImageView(backgroundImg);
backgroundIV.setFitHeight(14*BLOCK_SIZE);
backgroundIV.setFitWidth(212*BLOCK_SIZE);
levelWidth = LevelData.levels[levelNumber][0].length()*BLOCK_SIZE;
for(int i = 0; i < LevelData.levels[levelNumber].length; i++){
String line = LevelData.levels[levelNumber][i];
for(int j = 0; j < line.length();j++){
switch (line.charAt(j)){
case '0':
break;
case '1':
Block platformFloor = new Block(Block.BlockType.PLATFORM, j * BLOCK_SIZE, i * BLOCK_SIZE);
break;
case '2':
Block brick = new Block(Block.BlockType.BRICK,j*BLOCK_SIZE,i*BLOCK_SIZE);
break;
case '3':
Block bonus = new Block(Block.BlockType.BONUS,j*BLOCK_SIZE,i*BLOCK_SIZE);
break;
case '4':
Block stone = new Block(Block.BlockType.STONE,j * BLOCK_SIZE, i * BLOCK_SIZE);
break;
case '5':
Block PipeTopBlock = new Block(Block.BlockType.PIPE_TOP,j * BLOCK_SIZE, i * BLOCK_SIZE);
break;
case '6':
Block PipeBottomBlock = new Block(Block.BlockType.PIPE_BOTTOM,j * BLOCK_SIZE, i * BLOCK_SIZE);
break;
case '*':
Block InvisibleBlock = new Block(Block.BlockType.INVISIBLE_BLOCK,j * BLOCK_SIZE, i * BLOCK_SIZE);
break;
}
}
}
player =new Character();
player.setTranslateX(0);
player.setTranslateY(400);
player.translateXProperty().addListener((obs,old,newValue)->{
int offset = newValue.intValue();
if(offset>640 && offset<levelWidth-640){
gameRoot.setLayoutX(-(offset-640));
backgroundIV.setLayoutX(-(offset-640));
}
});
gameRoot.getChildren().add(player);
appRoot.getChildren().addAll(backgroundIV,gameRoot);
}
private void update(){
if(isPressed(KeyCode.UP) && player.getTranslateY()>=5){
player.jumpPlayer();
}
if(isPressed(KeyCode.LEFT) && player.getTranslateX()>=5){
player.setScaleX(-1);
player.animation.play();
player.moveX(-5);
}
if(isPressed(KeyCode.RIGHT) && player.getTranslateX()+40 <=levelWidth-5){
player.setScaleX(1);
player.animation.play();
player.moveX(5);
}
if(player.playerVelocity.getY()<10){
player.playerVelocity = player.playerVelocity.add(0,1);
}
player.moveY((int)player.playerVelocity.getY());
}
private boolean isPressed(KeyCode key){
return keys.getOrDefault(key,false);
}
@Override
public void start(Stage primaryStage) throws Exception {
initContent();
Scene scene = new Scene(appRoot,1200,620);
scene.setOnKeyPressed(event-> keys.put(event.getCode(), true));
scene.setOnKeyReleased(event -> {
keys.put(event.getCode(), false);
player.animation.stop();
});
primaryStage.setTitle("Mini Mario");
primaryStage.setScene(scene);
primaryStage.show();
AnimationTimer timer = new AnimationTimer() {
@Override
public void handle(long now) {
update();
}
};
timer.start();
}
public static void main(String[] args) {
launch(args);
}
}
I would be grateful to any kind of response. Thank you.