Как передать переменную из попытки в событие действия? - PullRequest
0 голосов
/ 26 ноября 2018
try(FileInputStream fis = (new FileInputStream("*FILE*"))){
            Player player = new Player(fis);
            Button btn = new Button();
            btn.setText("Start");
            Button btn2 = new Button();
            btn2.setText("Stop");
        }catch(JavaLayerException | IOException e ){
            e.printStackTrace();
        }

    btn.setOnAction((ActionEvent event) -> {
        this.player = player;
        try{
            new playMusic(player).start();
        }catch(Exception e){
            e.printStackTrace();
        }
    });

    btn2.setOnAction((ActionEvent event)->{
        player.close();
    });
  • Такое ощущение, что это должно быть что-то действительно простое, но я нигде не смог найти ничего

1 Ответ

0 голосов
/ 26 ноября 2018

Либо вы перемещаете код доступа к переменной внутри блока 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...