【问题标题】:Exception handling : throw, throws and Throwable异常处理:throw、throws 和 Throwable
【发布时间】:2011-04-25 19:24:54
【问题描述】:

你们谁能解释一下throwthrowsThrowable 之间的区别以及何时使用哪个?

【问题讨论】:

  • Java 两者都没有。它确实有一个 Throwable 类的throw 方法,并且它有一个用于方法头的throws 关键字。它们是两个完全不同的东西。首先忘记throws,只需弄清楚throw 做了什么。 throws 只是为了让编译器满意。

标签: java exception-handling throw throws throwable


【解决方案1】:
  • throws :在编写方法时使用,声明有问题的方法抛出了指定的(检查的)异常。

    与检查异常相反,运行时异常(NullPointerExceptions 等)可能会在没有声明 throws NullPointerException 的方法的情况下引发。

  • throw:实际抛出异常的指令。 (或者更具体地说,Throwable)。

    throw 关键字后跟对Throwable 的引用(通常是异常)。

示例:


  • Throwable:您必须扩展一个类,以便创建您自己的、自定义的、可投掷的。

示例:


【讨论】:

  • 为了将截图添加到代码 sn-ps,+1 先生。很好的答案。
  • 哇,感谢您的详细解释。
  • -1。 IllegalArgumentException 不是一个checkedException,refer。而且,RuntimeExceptions 不应该被捕获,它们至少可以被抛出。
【解决方案2】:
  • throw:抛出对象 t 的语句,其中 t instanceof java.lang.Throwable 必须为真。
  • throws:一个方法签名令牌,用于通过该方法指定检查异常thrown。
  • java.lang.Throwable:所有可以抛出(和捕获)的对象的父类型。

See here for a tutorial on using exceptions.

【讨论】:

    【解决方案3】:

    这真的很容易理解。

    java.lang.Throwable

    Throwable 类是 所有错误的超类和 Java 语言中的异常。仅有的 作为 this 实例的对象 类(或其子类之一)是 由 Java 虚拟机抛出或 可以被Java抛出 throw 声明。 同样,只有这个类或其中之一 它的子类可以作为参数 输入catch 子句。 More

    throws 关键字用于方法声明中,它指定了我们可以从该方法中期望什么样的异常[Throwable 类]。

    关键字throw用于抛出一个属于Throwable类实例的对象。


    免得看一些例子:

    我们为自己创建一个异常类

    public class MyException super Exception {
    
    }
    

    我们创建一个方法,从我们的异常类中创建一个对象,并使用关键字throwthrow

    private  void throwMeAException() throws MyException //We inform that this method throws an exception of MyException class
    {
      Exception e = new MyException (); //We create an exception 
    
      if(true) {
        throw e; //We throw an exception 
      } 
    }
    

    当我们要使用方法throwMeAException()时,我们不得不以特定的方式处理它,因为我们知道它会抛出一些东西,在这种情况下我们有三个选项。

    第一个选项是使用块 try 和 catch 来处理异常:

    private void catchException() {
    
       try {
         throwMeAException();
       }
       catch(MyException e) {
         // Here we can serve only those exception that are instance of MyException
       }
    }
    

    第二个选项是传递异常

       private void passException() throws MyException {
    
           throwMeAException(); // we call the method but as we throws same exception we don't need try catch block.
    
       }
    

    第三种选择是捕获并重新抛出异常

    private void catchException() throws Exception  {
    
       try {
         throwMeAException();
       }
       catch(Exception e) {
          throw e;
       }
    }
    

    恢复,当您需要停止某些操作时,您可以通过一些 try-catch 块抛出异常,该异常将返回直到不是服务器。无论您在哪里使用引发异常的方法,您都应该通过 try-catch 块处理它或将声明添加到您的方法中。

    此规则的例外是java.lang.RuntimeException,它们不必声明。这是关于异常使用方面的另一个故事。

    【讨论】:

    • 很好的例子。感谢您花时间和精力向我解释这一点。
    【解决方案4】:

    throw - 用于抛出异常。throw 语句需要一个参数:可抛出的类对象

    throws - 用于指定方法可以抛出异常

    Throwable - 这是 Java 语言中所有错误和异常的超类。您只能抛出从 Throwable 类派生的对象。 throwable 包含其线程在创建时的执行堆栈的快照

    【讨论】:

      【解决方案5】:

      Throw用于抛出异常,throws(如果我没猜错的话)用于表示方法可以抛出特定异常,Throwable类是Java中所有错误和异常的超类

      How to Throw Exceptions

      【讨论】:

        【解决方案6】:

        投掷:

        用于实际抛出异常,而 throws 是方法的声明。它们不可互换。

        throw new MyException("Exception!);
        

        投掷:

        当您没有在代码中使用 try catch 语句但您知道这个特定的类能够抛出某某异常(仅检查异常)时,将使用此方法。在这种情况下,您不使用 try catch 块,而是在代码中的适当位置使用 throw 子句编写,异常被抛出给方法的调用者并由它处理。当函数可能抛出已检查的异常时,也会使用 throws 关键字。

        public void myMethod(int param) throws MyException 
        

        【讨论】:

          【解决方案7】:

          有 2 种主要类型的异常:
          运行时异常(未选中):例如。 NullPointerException、ClassCastException、..
          检查异常: 例如。 FileNotFoundException, CloneNotSupportedException, ..

          运行时异常是在运行时发生的异常,开发人员不应试图捕捉或停止它。只有当满足错误条件时,您才编写代码来避免它们或发出命令throw。我们在方法体内使用 throw。

          public Rational(int num, int denom){
          if(denom <= 0) {
            throw new IllegalArgumentException("Denominator must be positive");
          }
          this.num=num;
          this.denom=denom;
          }
          

          但是对于检查的异常,JVM 希望你处理它,如果不处理就会给出编译器错误,因此你声明它会抛出该类型的异常,如下面的 clone() 方法所示。

          Class Employee{
          public Employee clone() throws CloneNotSupportedException{
              Employee copy = (Employee)super.clone();
              copy.hireDate = (Date)hireDate.clone();
              return copy;
          }
          }
          

          【讨论】:

            【解决方案8】:

            与上述相同的答案,但复制粘贴的乐趣

            public class GsonBuilderHelper {
                // THROWS: method throws the specified (checked) exception
                public static Object registerAndRun(String json) throws Exception {
            
                    // registering of the NaturalDeserializer
                    GsonBuilder gsonBuilder = new GsonBuilder();
                    gsonBuilder.registerTypeAdapter(Object.class, new NaturalDeserializer());
                    Gson gson = gsonBuilder.create();
            
                    Object natural = null;
                    try {
                        // calling the NaturalDeserializer
                        natural = gson.fromJson(json, Object.class);
                    } catch (Exception e) {
                        // json formatting exception mainly
                        Log.d("GsonBuilderHelper", "registerAndRun(json) error: " + e.toString());
                        throw new Exception(e);  // <---- THROW: instance of class Throwable. 
                    }
                    return natural;
                }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多