【问题标题】:Throwing Java Exceptions抛出 Java 异常
【发布时间】:2012-07-23 17:54:21
【问题描述】:

当方法抛出和异常时,我们是否需要在方法内部有一个 try 块?

例如,

    public void foo() throws SomeException{
        try{
            // content of method
        }
    }

是否需要 try 块?或者,该方法是否能够在没有它的情况下抛出 SomeException :

    public void foo() throws SomeException{
            // content of method
    }

当我们使用 throw 显式抛出 SomeException 时就是这种情况。

【问题讨论】:

    标签: java exception try-catch throw throws


    【解决方案1】:

    你基本上不需要在里面有一个 try 块

          public void foo() throws SomeException {
    // do some stuff
    // you decide to throw the exception by yourself:
    if (throwAnException) throw new SomeException();
    // or you call a method that throws SomeExpection:
    methodThatCanThrowSomeException();
    // do more stuff
     }
    

    【讨论】:

      【解决方案2】:

      1.如果我们是从程序调用的方法throws an Exception那么我们需要使用try/catch 围绕方法调用。

      2.假设我们正在编写一个方法 throws an exception那么我们需要 throw new Exception object 方法。

      3.异常是异常类型的对象。我们有Checked ExceptionUnchecked Exception (Runtime Exception)

      【讨论】:

        【解决方案3】:

        如果SomeException 是一个已检查异常,你必须要么

        • 使用try{}catch
        • 声明你的方法抛出它。

        您不必两者都做,您在问题中显示的任何一个示例都可以正常工作。

        不同之处在于,使用try 子句,您自己处理SomeException,而通过声明您自己的方法throws,您将处理SomeException 的责任委托给调用方法。

        【讨论】:

          【解决方案4】:

          您经常遇到的最有问题的情况是调用声明检查异常的方法。在现实生活中的绝大多数情况下不适合当场处理该异常,而是让它向上传播。不幸的是,Java 让您从头到尾重新声明同样的异常,这会造成混乱,暴露实现细节,并且通常还会破坏现有方法的约定。

          在这种情况下,继续进行的方法是包装并重新抛出

          catch (RuntimeException e) {throw e;} catch (Exception e) {throw new RuntimeException(e);}
          

          【讨论】:

          • 这不是他要求的,但这是一个非常有趣的技术。谢谢;)
          【解决方案5】:

          您不需要 try 块。

          public void foo() throws SomeException {
            // do some stuff
            // you decide to throw the exception by yourself:
            if (throwAnException) throw new SomeException();
            // or you call a method that throws SomeExpection:
            methodThatCanThrowSomeException();
            // do more stuff
          }
          

          只要您在签名中声明,就可以了。您的方法的调用者必须处理异常,而不是您。所以调用者可能会这样做:

          try {
            foo();
          } catch (SomeException e) {
            // handle exception
          }
          

          或者他可能会自己传递下去。

          【讨论】:

            【解决方案6】:

            当一个方法抛出一个异常时,它会将处理异常的责任交给它的调用者。 因此,如果您将其放入签名中,则无需处理异常。如下。

            public void foo(){
                    try{
                        // content of method
                    }
                }
            

            但是如果你这样写的话。

            public void foo() throws SomeException{
            
                }
            

            你会像下面这样调用你的方法。

            try{
            
               foo();
            }
            

            【讨论】:

              猜你喜欢
              • 2012-05-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-05-24
              • 2018-09-18
              • 2011-02-07
              • 2016-08-10
              • 2014-06-25
              相关资源
              最近更新 更多