不能抛出Exception类型的异常,异常类型必须是Throwable的子类

No exception of type Exception can be thrown, an exception type must be a subclass of Throwable

我在其他问题中搜索这个问题,但仍然没有弄清楚 Throwable 到底是什么意思。阅读一些关于它的文章(its superclas bla bla bla)但仍然不知道如何实现它。忘了说我是 java 的新手。任何建议将不胜感激:D

这是例外情况 class:

class Exception {
private int pDen;
private int pMes;
private int kDen;
private int kMes;

public Exception(int pDen, int pMes, int kDen, int kMes) {
    super();
    this.pDen = pDen;
    this.pMes = pMes;
    this.kDen = kDen;
    this.kMes = kMes;
}
public void message()
{
    System.out.println("Isklucok");
}
public void promena()
{
    int tmpDen = 0;
    int tmpMes = 0;
    tmpDen = pDen;
    pDen = kDen;
    kDen = tmpDen;
    tmpMes = pMes;
    pMes = kMes;
    kMes = tmpMes;
}

}

这是我在其他 class 中 运行 的代码,我应该在哪里捕获我抛出的异常。

try {
        if(pMes > kMes)
        {
            throw new Exception(pDen,pMes,kDen,kMes);
        }
        else if(pMes == kMes)
            if(pDen > kDen)
            {
                throw new Exception(pDen,pMes,kDen,kMes);
            }
    }
    catch(Exception e)
    {
        e.message();
        e.promena();
    }

使您的自定义异常扩展 Throwable 层次结构中的内容。

例如

// Exception here is java.lang.Exception, not the class from your example
public class MyException extends Exception {

    // ...

}

在您的自定义中 class 扩展了 Throwable。它的工作

 class Exception extends Throwable {
      //your code
  }

您必须创建一个包含所需 Constructors 的自定义 Exception class,如下所示:

public class CustomException extends Exception {
    /* Optional: Include Serial UID */

    public CustomException(Throwable t) {
        super(t);
    }

    public CustomException(int pDen, int pMes, int kDen, int kMes) {
        /* Handle Info & Throw Exception */
    }

}

然后就可以抛异常如下,

throw new CustomException(pDen,pMes,kDen,kMes);

请忽略建议您实施自己的 Exception class 的答案。 Java 有自己的:java.lang.Exception。只需使用它,并在需要时扩展它。拥有自己的 Throwable 但不从标准 Exception 扩展的情况非常罕见。

The class Exception and its subclasses are a form of Throwable that indicates conditions that a reasonable application might want to catch.

在大多数情况下,您的例外是以下情况之一:

  • 算术异常
  • ArrayIndexOutOfBoundException
  • ClassNotFoundException
  • IOException
  • NoSuchMethodException ...

An Error is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.

ExceptionError 都是 Throwable 的子类。

如果您不仅需要捕获 Exceptions,还需要捕获 Errors,您应该使用 Throwable。但是:

Most such errors are abnormal conditions. The ThreadDeath error, though a "normal" condition, is also a subclass of Error because most applications should not try to catch it.

如果你想捕获像 ThreadDeath 这样的错误,你可以使用 Throwable。这可能是一种非常罕见的情况。

在你的例子中,如果你只是想检查数字,你可以使用这样的东西:

public static void check(int pDen, int pMes, int kDen, int kMes) {

    if (pMes > kMes) {
        throw new IllegalArgumentException ("Your message.....");
    } else if (pMes == kMes) {
        if (pDen > kDen) {
            throw new IllegalArgumentException ("Your message.....");
        }
    }
}

编写任何 Java 程序时避免此常见错误的要点:

  1. 确保您没有为 Exception class.
  2. 导入任何包
  3. 如果您发现任何导入,请将其删除。
  4. 可以通过扩展Exception来实现class。
  5. 或者从方法中抛出一个 Exception
  6. 在创建自定义消息时使用 throw 与方法上的 throws 关键字一起抛出。

当我没有将 Exception 类型导入正在捕获它的 class 时,我遇到了这个异常