Либо вы перемещаете код доступа к переменной внутри блока try
, либо объявляете переменную вне блока try
и убедитесь, что она инициализируется при регистрации обработчика события.
final Player player;
try(FileInputStream fis = new FileInputStream("*FILE*")){
player = new Player(fis);
} catch(JavaLayerException | IOException e){
e.printStackTrace();
// prevent access to uninitialized player variable by exiting the method
throw new RuntimeException(e);
}
Button btn = new Button();
btn.setText("Start");
Button btn2 = new Button();
btn2.setText("Stop");
btn.setOnAction((ActionEvent event) -> {
this.player = player;
try{
new playMusic(player).start();
} catch(Exception e){
e.printStackTrace();
}
});
btn2.setOnAction((ActionEvent event)->{
player.close();
});
Вместо
throw new RuntimeException(e);
вы также можете изящно выйти из метода, используя вместо этого
return;
.
Редактировать
Если Player
не читает весь код в конструкторе, вы не должны закрывать его.try-with-resources делает это все же.Изменить на try
catch
try {
FileInputStream fis = new FileInputStream("*FILE*");
try {
player = new Player(fis);
} catch(JavaLayerException | IOException e) {
e.printStackTrace();
fis.close(); // close stream on player creation failure
// prevent access to uninitialized player variable by exiting the method
throw new RuntimeException(e);
}
} catch(IOException e){
e.printStackTrace();
// prevent access to uninitialized player variable by exiting the method
throw new RuntimeException(e);
}