Никакое исключение типа Exception не может быть выброшено, тип исключения должен быть подклассом Throwable

Я искал эту проблему в других вопросах, но до сих пор не понял, что именно означает Throwable. Прочитал несколько статей об этом (это суперклас бла бла бла), но до сих пор не знаю, как это реализовать. Забыл упомянуть, что я новичок в java. Приму любой совет с благодарностью :D

Вот класс исключения:

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;
}

}

И вот код, который я запускаю в другом классе, где я должен поймать свое исключение, где оно выдается.

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();
    }

person VL4DiMiRG    schedule 26.10.2018    source источник
comment
Зачем создавать свой собственный класс исключений вместо использования, например, IllegalArgumentException или IllegalStateException?   -  person Panagiotis Kanavos    schedule 26.10.2018


Ответы (6)


Сделайте так, чтобы ваше пользовательское исключение расширяло что-то из иерархии Throwable.

Например

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

    // ...

}
person Community    schedule 26.10.2018

Класс Exception и его подклассы представляют собой форму Throwable, которая указывает условия, которые разумное приложение может захотеть перехватить.

В большинстве ситуаций вашим исключением будет одно из следующих:

  • Арифметическое исключение
  • ArrayIndexOutOfBoundException
  • Класснотфаундексцептион
  • IOException
  • NoSuchMethodException...

Ошибка — это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться отловить.

И Exception, и Error являются подклассами Throwable.

Если вам нужно поймать не только Exceptions, но и Errors, вы должны использовать Throwable. Но:

Большинство таких ошибок являются ненормальными условиями. Ошибка ThreadDeath, хотя и является «нормальным» состоянием, также является подклассом ошибки, поскольку большинству приложений не следует пытаться ее перехватить.

Если вы хотите поймать такую ​​​​вещь, как ошибка 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.....");
        }
    }
}
person Hülya    schedule 26.10.2018

Пожалуйста, игнорируйте ответы, предлагающие вам реализовать свой собственный класс Exception. У Java есть свои: java.lang.Exception. Просто используйте это и расширьте его, если это необходимо. Случаи, когда есть смысл иметь свой Throwable, а не расширять стандартный Exception, очень редки.

person Jorn    schedule 26.10.2018

Вам нужно будет создать собственный класс Exception, содержащий требуемый Constructors, следующим образом:

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);
person user2004685    schedule 26.10.2018

Очки, чтобы избежать этой распространенной ошибки при написании любой программы Java:

  1. Убедитесь, что вы не импортируете какой-либо пакет для класса Exception.
  2. Если вы найдете какой-либо импорт для этого, удалите его.
  3. Вы можете реализовать, расширив класс Exception.
  4. Или выкинув Exception из метода.
  5. Используйте throw при создании пользовательского сообщения, которое будет выдано вместе с ключевым словом throws в методе.
person Nahid    schedule 08.08.2019

В вашем пользовательском классе расширяется Throwable. Это работает

 class Exception extends Throwable {
      //your code
  }
person sasikumar    schedule 26.10.2018