Java 当使用try块时,为什么我必须附加带有抛出异常的方法签名?
下面是一些我确实误解的东西 掷骰子;导致未报告的异常错误 它要求必须抓住它或宣布它。。。但是它就在下面的试块里被抓到了 为什么编译器需要像这样在方法签名中显式抛出异常? 所需的方法签名:Java 当使用try块时,为什么我必须附加带有抛出异常的方法签名?,java,Java,下面是一些我确实误解的东西 掷骰子;导致未报告的异常错误 它要求必须抓住它或宣布它。。。但是它就在下面的试块里被抓到了 为什么编译器需要像这样在方法签名中显式抛出异常? 所需的方法签名: private static void div(int i, int j) throws Exception 代码: public class Exam { private static void div(int i, int j) { try {
private static void div(int i, int j) throws Exception
代码:
public class Exam {
private static void div(int i, int j) {
try {
System.out.println(i / j);
} catch(ArithmeticException e) {
Exception ex = new Exception(e);
throw ex;
}
}
public static void main(String[] args) {
try {
div(5, 0);
} catch(Exception e) {
System.out.println("END");
}
}
}
顺便说一句,正确的方法是允许
arithmetricexception
在需要时结束程序
public class Exam {
private static void div(int i, int j) throws ArithmeticException {
System.out.println(i / j);
}
public static void main(String[] args) throws Exception {
div(5, 0);
}
}
异常提供了查找运行时错误所需的重要调试信息
我认为要捕获第二个异常,您需要做的是嵌套
try
。对于同一个try
可以有多个catch
,它们都只捕获一个异常,而不是级联或按顺序执行。要捕获由catch
引发的异常,您需要另一个try
块
private static void div(int i, int j) {
try { // NESTED HERE
try {
System.out.println(i / j);
} catch(ArithmeticException e) {
Exception ex = new Exception(e);
throw ex;
}
// THIS GOES WITH THE OUTER NESTED 'try'
} catch( Exception x ) {
System.out.println( "Caught a second exception: " + x );
}
}
但同样,你不应该这样做。允许抛出原始异常是更好的选择。非常感谢我从所有用户的评论和回答中收到的信息。 我的结论是: 此catch语句处理一个异常:
try{
stuff
}catch(OnlyThisException ex){
throw ex; //CHECKED EXCEPTION
}
此catch语句也只处理一个异常,另一个异常未处理:
try{
stuff
}catch(OnlyThisException ex){
Exception ex = new Exception(e); //UNCHECKED! Needs catch block
throw ex; //CHECKED EXCEPTION
}
您正在从catch块内部抛出类型为
exception
的新异常,该异常是已检查的异常。无法捕获此新异常(即,它没有被try-catch包围)。正在捕获它,然后抛出另一个异常。顺便说一下,不要这样做。通过抛出一个不同的异常,您不会向该异常添加任何“值”。只需删除try-catch并允许抛出原始异常。从长远来看你会更快乐的。好吧,既然你问了。你的问题研究得很差。这是任何Java教科书或(好的)教程中描述的基本内容。缺乏研究是投反对票的一个很好的理由。(虽然我没有。)(当我在“[java]”中搜索“未报告的异常”时,我的点击率超过500次。大多数人都会给你这个问题的答案。你忘了下一票和评论也是StackOverflow体验的一部分吗?你可能想将鼠标悬停在下一票按钮上,看到一个工具提示,告诉你什么时候适合下一票。缺少研究是可能的选择之一。“其中有一个异常”是不相关的。这里可以捕获更多的异常,甚至可以在catch中创建更多的异常(如问题中的示例)。主要的问题是,某些已检查的异常仍然会从该异常中抛出,并且在该方法中没有处理该抛出异常的try-catch,这意味着该方法将在外部抛出该异常,因此它必须通过在声明部分添加throws…
来通知客户端该事实。@Pshemo我将尝试编辑该异常,但我被拒绝了而且我不能删除原始代码。try
块中没有额外的异常,catch
语句只能捕获ISException
或它的任何派生类,这使得它的名称很糟糕。这两个代码块没有你认为的差异。你这里的问题是throw ex;
。这会引发一个异常,只要它是一个已检查的异常,您是否只是重新引发捕获的异常(示例一)或将其包装在异常中(示例二)并不重要,在这两种情况下,这些异常都不会被处理,因此您将从问题中得到编译器错误。我假定您不清楚的部分是,catch
对于发生在其自身代码块中的内容根本不保护您。它只能保护try{}中的内容
。catch中抛出的异常未经处理。Oracle提供了一系列Java中异常的教程,我建议您可以看看,它们可能会提供有用的信息:谢谢,我真的需要对此进行更深入的研究。我并不是100%地坚持到程序结束。@Chrips我认为您缺少的是uld需要第二个嵌套的尝试
来捕获第二个异常。请查看我的更新答案。是的,肯定可以。我真的很困惑。谢谢