所以我有两个关于 java 的一般性问题。第一个是什么时候在方法主体中使用 try/catch 与在声明方法时使用 throws 异常?这是我的意思的一个小例子。这:
public void whileChatting() throws IOException{}
对比
public void closeConnection() {
try {
} catch (IOException ioException) {
ioException.printStackTrace();
}
}
然后我的第二个问题是什么时候知道捕获或抛出哪种类型的异常?我指的是 IOException 或 EOFException 等异常......
如果有一个很好的链接,有人可以发给我教所有这些(因为它可能比我想象的更复杂),我会像你回答它一样感激。
谢谢。
抛出异常
在你的第一个例子中,
public void whileChatting() throws IOException{}
意味着它只会向调用该函数的任何对象抛出异常。然后可以在使用 try-catch block 调用该方法时捕获它。比如
try{
whileChatting();
}
catch(IOException e){
e.printStackTrace();
}
抛出一个方法基本上将它向上传播到链中,因此任何调用该方法的方法也需要包含 throws IOException
,否则异常将需要在更高级别的方法中处理(通常通过 try-catch block )。
捕获异常
捕获异常是一种优雅地处理异常的方法。常见的做法是 e.printStackTrace();
将错误的详细信息打印到控制台,但这并不总是必要的。有时您可能想要执行 System.exit(0)
甚至 System.out.println("Error in method whileCalling()")
使用 catch block ,您可以捕获任何类型的异常!您还可以执行 try-catch-finally block ,它将运行 try block 中的代码,捕获任何异常,无论是否捕获到任何异常,它都会进入 finally block 并运行该代码。
要了解您可能需要捕获的异常,您可以查看可能抛出异常的类的 Javadoc。在那里你会找到一个列表,列出了类可以抛出的所有可能的东西。您也可以只捕获 Exception
,这将捕获任何可以想象的异常! (好吧,授予它扩展异常)
最后,您可以像这样将 catch block 链接在一起。
try{
whileCalling();
}
catch(IOException e){
//handle this situation
}
catch(FileNotFoundException e){
//handle this situation
}
catch(Exception e){
//handle this situation
}
这将像 and else-if block 一样工作并且不会捕获重复项。
所以基本上回答你的问题:
1: throw
异常意味着让其他人处理它,无论这是另一个类、另一个方法,还是只是希望它不会发生否则你的程序会崩溃(非常糟糕的做法)。
2: 使用 try catch block 实际上是按照您认为合适的方式处理异常!打印出堆栈跟踪以进行调试或给用户一个新的提示以重新输入一些东西。 (例如提示用户需要输入文件位置然后抛出 FileNotFoundException
)
希望对您有所帮助!