Java中捕获与抛出异常

时间:2015-07-04 01:24:23

标签: java exception try-catch throws

所以我一般有两个关于java的一般性问题。第一个是在方法体中何时使用try / catch而在声明方法时使用throws异常?这是我的意思的一点演示。这样:

public void whileChatting() throws IOException{}

public void closeConnection() {
    try {
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }
}

然后我的第二个问题是,何时知道捕获或抛出什么类型的异常?我的意思是IOException或EOFException之类的异常等......

如果有一个很好的联系,有人可以让我教这一切(因为它可能比我想的更复杂)我会像你回答一样感激。 感谢。

4 个答案:

答案 0 :(得分:8)

抛出例外

在你的第一个例子中,

public void whileChatting() throws IOException{}

意味着它只会将异常抛出到调用函数的任何内容中。然后可以在使用try-catch块调用该方法时捕获它。比如

try{
    whileChatting();
}
catch(IOException e){
    e.printStackTrace();
}

抛出一个方法基本上将它传播到链中,因此调用此方法的任何方法都需要包含throws IOException,或者需要在更高级别的方法中处理异常(通过通常是一个try-catch块。

捕获例外

捕获异常是一种优雅处理异常的方法。常见的事情是e.printStackTrace();,它将错误的详细信息打印到控制台,但并不总是必要的。有时您可能想要System.exit(0)甚至System.out.println("Error in method whileCalling()")

使用catch块可以捕获任何类型的异常!您还可以执行try-catch-finally块,它将运行try块中的代码,捕获任何异常,以及是否捕获任何异常,它将进入finally块并运行该代码。

要知道可能需要捕获的异常,可以查看可能引发异常的类的Javadoc。在那里你会找到一个列表,列出班级可以抛出的每一件事。您也可以捕获Exception,它将捕获任何可以想象的异常! (好吧,授予它扩展Exception)

最后你可以将catch块链接在一起。

try{
    whileCalling();
}
catch(IOException e){
    //handle this situation
}
catch(FileNotFoundException e){
    //handle this situation
}
catch(Exception e){
    //handle this situation
}

这将起作用,否则 - 如果阻止而不捕获重复项。

所以基本上回答你的问题:

1:throw一个例外意味着让其他人处理它,无论这是另一个类,另一种方法,还是只是希望它不会发生,或者你的程序会崩溃(非常糟糕的做法)。

2:使用try catch块实际上是处理Exception但是你觉得合适!打印出堆栈跟踪以进行调试或为用户提供重新输入内容的新提示。 (例如,提示用户需要输入文件位置,然后它会抛出FileNotFoundException

希望有所帮助!

答案 1 :(得分:4)

两条好的经验法则:

没有硬性和快速的答案。

一般情况下,您可能会比使用自定义“try / catch”更频繁地使用“throws”。仅仅因为你将拥有“知道如何恢复”的相对较少的“决策”模块,但你会有相应的“很多”模块可以抛出异常。

答案 2 :(得分:1)

当你想要处理它的原因时你使用try / catch,否则你应该传播它以便在适当的时候对它进行处理。

一个好的开始是javadoctutorialspoint for exceptions

答案 3 :(得分:0)

基本上是这样的:

  1. throws -引发异常的函数告诉其父函数某些错误。例如,您有一个 createFunction()引发SQLException ,您试图在数据库中插入100个项目,但创建数字98失败。 createFunction()用于接收此SQLException的 main()

  2. 尝试/捕获- main()知道 createFunction()应该在出现问题时引发SQLException因此,当它实现时,将其放入 try / catch块,这样,如果实际上抛出了SQLException,则可以在catch块中执行回退计划,例如数据库回滚。

    我刚才所说的实际代码:

     createFunction(Connection connection) throws SQLException {
          //insert items in the database
     }
    
     main(){
    
        try{
         createFunction(connection);
        }
        catch (SQLException e){
          connection.rollback();
        }
     }
    
相关问题