Java 修改IllegalArgumentException

Java 修改IllegalArgumentException,java,exception,exception-handling,try-catch,illegalargumentexception,Java,Exception,Exception Handling,Try Catch,Illegalargumentexception,我有以下几行代码,我应该编写一个IllegalArgumentException异常,这样当我运行它时,它会返回“Poland ready exists”。我已经读了很多关于异常的书,但是我不知道我应该如何编写IllegalArgumentException,在它的构造函数中放什么,等等(我只知道我必须有一个构造函数和消息的getMessage()方法。) 更具体地说:我如何更改IllegalArgumentException的“原因”:我如何让它检查国家名称的相似性 public stat

我有以下几行代码,我应该编写一个IllegalArgumentException异常,这样当我运行它时,它会返回“Poland ready exists”。我已经读了很多关于异常的书,但是我不知道我应该如何编写IllegalArgumentException,在它的构造函数中放什么,等等(我只知道我必须有一个构造函数和消息的getMessage()方法。)

更具体地说:我如何更改IllegalArgumentException的“原因”:我如何让它检查国家名称的相似性

  public static void main(String[] args) {
    Country country1 = new Country("Poland");

    try{
        Country country = new Country("Poland");
    }
    catch(IllegalArgumentException ie){
        System.out.println(ie.getMessage());
    }
}

您不需要定义新的异常类,只需要抛出现有的异常类

public Country(String name) {
  if (INSTANCES.contains(this)) 
    throw new IllegalArgumentException(name + " already exists.");
}
需要更多的代码来维护
实例集

class IAE
{
    public static void main(String args[])
    {
        throw new IllegalArgumentException("Poland doesn't exist");
    }
}
将输出

Exception in thread "main" java.lang.IllegalArgumentException: Poland doesn't exist
    at IAE.main(iae.java:6)

或者你也可以,但从你描述的来看,这似乎没有必要。

例外:这实际上只是构建一个新的问题。已使用该方法设置了所有异常。因此,您只需使用所需的消息实例化一个

复制国家的事情完全是另一回事。这取决于Country类本身,但真正简单的方法是使用
集合

国家级{
private static final HashSet EXISTING=新HashSet();
私有最终字符串名;
国家(字符串名称){
if(现有的.contains(名称))
抛出新的IllegalArgumentException(名称+“已存在!”);
this.name=名称;
现有。添加(名称);
}
}
这没关系,但若国家更复杂,也许就没那个么简单了。还有一个问题是,这意味着国家只能建设一次,即使它们是垃圾收集的

如果国家本身可以“再利用”,那么就有可能对其进行跟踪,如下所示:

class Country {
    private static final HashMap<String, Reference<Country>> EXISTING = (
        new HashMap<String, Reference<Country>>()
    );

    private final String name;

    Country(String name) {
        WeakReference<Country> existing = EXISTING.get(name);
        if(existing != null && existing.get() != null)
            throw new IllegalArgumentException(name + " already exists!");

        this.name = name;
        EXISTING.put(name, new WeakReference<Country>(this));
    }
}
国家级{
私有静态最终哈希映射存在=(
新HashMap()
);
私有最终字符串名;
国家(字符串名称){
WeakReference existing=existing.get(名称);
if(existing!=null&&existing.get()!=null)
抛出新的IllegalArgumentException(名称+“已存在!”);
this.name=名称;
现有.放置(名称,新WeakReference(this));
}
}

不过,这可能有点过头了。这两种方法中的任何一种都适用于您的主要方法。在这里,它在Ideone中工作:

创建一个IllegalArgumentException不会比这更复杂。你问题的答案可能实际上取决于你的国家班。例如,波兰已经存在意味着什么?你是如何跟踪的(如果你跟踪的话)?我没有,这就是为什么我不明白我应该如何检查名字的相似性。考虑到以上是我的全部主要方法,它应该在Country类或exception类中的某个地方,但我对异常的理解还不够透彻,所以我感到困惑?基本上,似乎你应该修改Country。@MarkoTopolnik编写的答案显示了除了跟踪Country的实例之外,异常所需使用的几乎完全相同的逻辑。但这意味着没有getMessage方法,正如我所说,我的主要方法必须与上述方法完全相同,因此,我必须为它创建一个新的自定义异常…这让我回到第1步,我的整个主要方法必须是上面的,我应该使用一个try-catch块,我看不出你的答案对我有任何帮助…问题是我应该使用上面主要方法的确切格式,所以我必须有一个.getMessage方法,因此,必须有一个新的异常类…IllegalArgumentException已经有了这个方法。它返回您传递给构造函数的内容。
class Country {
    private static final HashMap<String, Reference<Country>> EXISTING = (
        new HashMap<String, Reference<Country>>()
    );

    private final String name;

    Country(String name) {
        WeakReference<Country> existing = EXISTING.get(name);
        if(existing != null && existing.get() != null)
            throw new IllegalArgumentException(name + " already exists!");

        this.name = name;
        EXISTING.put(name, new WeakReference<Country>(this));
    }
}