尝试从Java执行外部程序时未处理的IOException

时间:2018-03-01 16:18:17

标签: java exe ioexception

我想让我的程序执行此安装程序(SnakeInstaller.exe)。我正在使用Runtime类,但我得到一个未处理的IOException,当我运行代码时出现错误:

  

线程中的异常" AWT-EventQueue-0" java.lang.Error:未解决的编译问题:未处理的异常类型IOException"。

我尝试过使用throw IOException,但它只是给了我一个错误。

public Board() {
    //This sets the color for the score label and where it is going it be.
    setLayout(null);
    scoreLabel.setForeground(Color.white);
    add(scoreLabel);
    scoreLabel.setBounds(625, 665, 100, 50);

    //This sets the color for the info label and where it is going it be.
    infoLabel.setForeground(Color.white);
    add(infoLabel);
    infoLabel.setBounds(5, 665, 500, 50);

    difficultyLabel.setForeground(Color.white);
    add(difficultyLabel);
    difficultyLabel.setBounds(600,650,100,50);

    //This starts the key listener and sets the background color of the JPanel.
    addKeyListener(new TAdapter());
    setBackground(Color.black);
    setFocusable(true);

    //This sets the size of the board.
    setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
    //Goes the the loadImages method and difficulty method.
    loadImages();
    difficulty();

    Runtime.getRuntime().exec("X:/Snake/SnakeInstaller.exe");
}

1 个答案:

答案 0 :(得分:0)

尽管您仍然遇到编译错误,但您尝试运行程序。这是异常告诉你的。

编译错误是Runtime.getRuntime().exec(...)可以抛出IOException,并且你必须对它做一些事情(因为它是所谓的"已检查的异常"):

  • Board()构造函数的throws子句中声明它,就像在public Board() throws IOException {中一样。当然,这同样适用于使用构造函数new Board()的地方。然后,该方法还必须获得throws IOException子句,依此类推,直到最高级别,通常是main()方法。
  • 或者抓住异常,明智地决定在catch(IOException ex)部分做什么。我猜你的程序无法在没有运行SnakeInstaller的情况下继续运行。所以一个好的方法可能是throw new RuntimeException(ex);那里(这个是"未经检查",这意味着你可以抛出它而不声明它)。这样可以确保程序不会无声地继续,产生废话,并且原始异常的信息(例如堆栈跟踪)仍然可供您检查。另一种方法是执行ex.printStacktrace();System.exit(1);或者,如果您知道如何在没有SnakeInstaller的情况下继续操作,只需向用户显示警告消息。

当然,还有很多其他选项,所以我建议阅读Java的异常系统(学习理论)和关于该主题的许多stackoverflow问题(至了解良好的使用模式。)

详细解释throw new RuntimeException(ex)方法:

public Board() {
    //This sets the color for the score label and where it is going it be.
    setLayout(null);
    scoreLabel.setForeground(Color.white);
    add(scoreLabel);
    scoreLabel.setBounds(625, 665, 100, 50);

    //This sets the color for the info label and where it is going it be.
    infoLabel.setForeground(Color.white);
    add(infoLabel);
    infoLabel.setBounds(5, 665, 500, 50);

    difficultyLabel.setForeground(Color.white);
    add(difficultyLabel);
    difficultyLabel.setBounds(600,650,100,50);

    //This starts the key listener and sets the background color of the JPanel.
    addKeyListener(new TAdapter());
    setBackground(Color.black);
    setFocusable(true);

    //This sets the size of the board.
    setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT));
    //Goes the the loadImages method and difficulty method.
    loadImages();
    difficulty();
    try {
        Runtime.getRuntime().exec("X:/Snake/SnakeInstaller.exe");
    } catch (IOException ex) {
        throw new RuntimeException(ex);
    }
}