所以我一般有两个关于java的一般性问题。第一个是在方法体中何时使用try / catch而在声明方法时使用throws异常?这是我的意思的一点演示。这样:
public void whileChatting() throws IOException{}
与
public void closeConnection() {
try {
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
然后我的第二个问题是,何时知道捕获或抛出什么类型的异常?我的意思是IOException或EOFException之类的异常等......
如果有一个很好的联系,有人可以让我教这一切(因为它可能比我想的更复杂)我会像你回答一样感激。 感谢。
答案 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,否则你应该传播它以便在适当的时候对它进行处理。
答案 3 :(得分:0)
基本上是这样的:
throws -引发异常的函数告诉其父函数某些错误。例如,您有一个 createFunction()引发SQLException ,您试图在数据库中插入100个项目,但创建数字98失败。 createFunction()用于接收此SQLException的 main();
尝试/捕获- 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();
}
}