非法论证异常

时间:2009-09-13 10:15:16

标签: java

当我输入一个不在列表中的字符串时,我在我的枚举犯罪类型

中收到此错误
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();  
}

枚举等级

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 个答案:

答案 0 :(得分:4)

这意味着你在第一行中所说的“不在列表中的字符串”,

CrimeType.valueOf(crime)将返回与字符串犯罪匹配的CrimeType。

Javadoc for valueOf表示如果没有指定名称的常量,则会抛出IllegalArgumentException。

然后你在代码中必须决定当字符串与枚举不匹配时该怎么做。

第一步将valueOf包含在try catch块中,然后在catch中执行某些操作,可能会打印出您有未知字符串或无法执行任何操作或...

答案 1 :(得分:1)

你可能应该把你的电话打包到

CrimeType newCrime = CrimeType.valueOf(crime);

在try / catch块中。这是代码失败的地方。

答案 2 :(得分:1)

当使用未在枚举中定义的字符串调用时,这是调用valueOf的预期行为。

答案 3 :(得分:1)

您当前的问题在于,在确定输入的行后,您仍然会尝试查找...直接导致IllegalArgumentException。

然而,顺便说一句,为什么还有额外的逻辑呢?枚举可以非常愉快地包含daysToStay数据。

e.g。

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