Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当使用try块时,为什么我必须附加带有抛出异常的方法签名?_Java - Fatal编程技术网

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需要第二个嵌套的
尝试
来捕获第二个异常。请查看我的更新答案。是的,肯定可以。我真的很困惑。谢谢