Почему я получаю незарегистрированное исключение? - PullRequest
1 голос
/ 11 августа 2011

Почему я получаю сообщение об ошибке «Не зарегистрированное исключение StupidNameException; должно быть перехвачено или объявлено как выброшенное»?

Вот мои блоки кода:

/**
 * @throws StupidNameException
 */
abstract class Person {
    private String firstName;
    private String lastName;

    public Person(String firstName, String lastName) throws StupidNameException {
        if (firstName == "Jason") {
           throw new StupidNameException("first name cannot be null");
        } 
        this.firstName = firstName;

        if (lastName == "Harrisson") {
            throw new StupidNameException("last name cannot be null");
        }
        this.lastName = lastName;
    }

    // Rest of class goes here ...
}

class Student  extends Person {
    private String ultimateGoal;
    private double GPA;

    /**
     * @throws StupidNameException when name is "Jason" or "Harrisson"
     */
    public Student(String firstName, String lastName, String ultimateGoal, double GPA) {
        super(firstName, lastName);
        this.ultimateGoal = ultimateGoal;
        this.GPA = GPA;
    }

    // Rest of class goes here ...
}

Ответы [ 3 ]

5 голосов
/ 11 августа 2011

Посмотрите на документацию, которую вы написали сами:

/**
 * @throws StupidNameException when name is "Jason" or "Harrisson"
 */
public Student(String firstName, String lastName, String ultimateGoal, double GPA) {
    // ...

Где throws StupidNameException? Об этом интересуется компилятор Java.

Исправьте это соответственно:

/**
 * @throws StupidNameException when name is "Jason" or "Harrisson"
 */
public Student(String firstName, String lastName, String ultimateGoal, double GPA) throws StupidNameException {
    // ...

Это необходимо, потому что вы вызываете super(firstName,lastName), который сам по себе выдает это исключение. Он должен быть либо пойман в try-catch, либо, лучше, пройден через throws.

2 голосов
/ 11 августа 2011

В любом случае. Какой-то метод, который вы вызываете в своем коде, вызывает исключение StupidNameException. Вы должны обработать его в try { ... } catch () ... или добавить throws StupidNameException к методу, в котором вы его вызываете.

В вашем случае, «метод» является конструктором Student. Поскольку конструктор суперкласса выдает Stupid..., конструктор подкласса также должен выкинуть, или вы должны выполнить try { super( ... ) } catch( ... ) { ... }.

2 голосов
/ 11 августа 2011

Потому что вы используете "==" для сравнения строк.Вам необходимо использовать equals () или equalsIgnoreCase () (если регистр не имеет значения) для сравнения строковых объектов.Измените следующие строки кода на то, что у меня есть: -

    if(firstName!=null && firstName.equals("Jason")) {
        throw new StupidNameException("first name cannot be null");
    } 

        this.firstName = firstName;

    if(lastName!=null && lastName.equals("Harrisson")) {
        throw new StupidNameException("last name cannot be null");
    }

Хотя я не уверен, почему вы хотите выбросить исключение Null, если имя «Джейсон» или «Харрисон».Они явно не равны NULL.

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

Поскольку вы обновили свой пост правильным вопросом, как @BalusC упомянул, ваша проблема заключается в том, что вы не определили класс исключений.Однако вам все еще нужно исправить то, что я упомянул в своем ответе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...