Незаконное исключение аргумента - PullRequest
1 голос
/ 13 сентября 2009

Когда я ввожу строку, которой нет в списке, я получаю эту ошибку в моем enum CrimeType

class: IllegalArgumentException, no enum const class CrimeType.a(in java.lang.Enum).

Что это значит и как я могу это исправить?

public void enterCrime()
{
    Crimes crimes = new Crimes();
    System.out.print("\t\tEnter crime: ");
    crimeName = In.nextLine();

    if("murder".equals(crimeName) || "arson".equals(crimeName) || "assault".equals(crimeName))
    {            
        crimes.daysToStay(3);        
    }
    else if("fraud".equals(crimeName) || "theft".equals(crimeName) || "vandalism".equals(crimeName))
    {
        crimes.daysToStay(2);
    }
    else if("drunk".equals(crimeName) || "littering".equals(crimeName) || "badHair".equals(crimeName))
    {
        crimes.daysToStay(1);
    }
    else
    {
        System.out.println("\t\tThat is not a valid crime. The crimes are");
        crimes.list();
    }      
    crimes.add(crimeName);
    enterAction();  
}

Enum Class

public enum CrimeType
{
    murder, arson, assault, fraud, theft, vandalism, drunk, littering, badHair;
}

Класс преступлений

import java.util.*;
import java.text.*;
public class Crimes
{
    private LinkedList<CrimeType> crimes = new LinkedList<CrimeType>();    

    public Crimes()
    {       
    }

    public void add(String crime)
    {
        CrimeType newCrime = CrimeType.valueOf(crime);
        crimes.add(newCrime);
    }

Ответы [ 4 ]

4 голосов
/ 13 сентября 2009

Это означает, что вы сказали в первой строке "строку, которой нет в списке"

CrimeType.valueOf (crime) вернет CrimeType, соответствующий строке Преступление.

Javadoc для valueOf говорит, что если не существует константы с указанным именем, он выдаст исключение IllegalArgumentException.

Затем вы в коде должны решить, что делать, если строка не соответствует перечислению.

Первым шагом для того, чтобы заключить valueOf в блок try catch, а затем в catch сделать что-то, можно распечатать, что у вас есть неизвестная строка или вы ничего не можете сделать или ...

1 голос
/ 13 сентября 2009

Ваша текущая проблема заключается в том, что после определения введенной строки не действителен, вы все еще пытаетесь найти ее ... ведущую непосредственно к IllegalArgumentException.

Однако, кроме того, зачем нужна дополнительная логика? Перечисление вполне может содержать данные daysToStay.

, например

public void enterCrime() {
    Crimes crimes = new Crimes();
    System.out.print("\t\tEnter crime: ");
    crimeName = In.nextLine();

    try { 
        crimes.add(crimeName);

    } catch (IllegalArgumentException e) {
        System.out.println("\t\tThat is not a valid crime. The crimes are");
        crimes.list();

    }      
    enterAction();  
}

public enum CrimeType {
    murder(3), arson(3), assault(3), 
    fraud(2), theft(2), vandalism(2), 
    drunk(1), littering(1), badHair(1);

    private final int daysToStay;

    CrimeType(in daysToStay) {
        this.daysToStay = daysToStay;
    }

    public int getDaysToStay() {
        return daysToStay;
    }
}
1 голос
/ 13 сентября 2009

Это ожидаемое поведение вызова valueOf при вызове со строкой, которая не определена в перечислении.

1 голос
/ 13 сентября 2009

Вы, вероятно, должны перевести ваш звонок на

CrimeType newCrime = CrimeType.valueOf(crime);

в блоке try / catch. Вот где код не работает.

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