我写了一个抽象类“卡片”,其中有两个名为“粘贴”和"PlayingCard“的子类。类"PlayingCard“有一个名为"Color”属性的枚举对象,该属性主要表示它是哪种类型的卡片(心脏、黑桃、.)。在这个枚举中,我有一个基于字符串的返回对象的方法:如果我把字符串“黑桃”传递给它,它将返回一个包含黑桃的对象。如果传递给它的字符串不以卡片类型存在(所以不是心、黑桃、.),它会抛出一个自制的"TypeUnknownException“。这个异常只是调用它的超级(字符串消息)。
现在,在读取文件并生成Card对象的不同类中:
Card c= (Card) Class.forName(one).getConstructor(String.class, double.class).newInstance(two, three);one是txt文件中的一个字符串(它始终是一个实现的类名,比如贴纸或Playingcard ),two是从txt文件中提取的字符串(应该是一种类似黑桃的卡片类型,但可以是不同的,这应该会抛出异常,以该字符串作为消息),而三则是从txt文件中解析的双重字符。
这将调用粘贴或PlayingCard中的构造函数。当它从PlayingCard调用构造函数时,它应该能够抛出我的"TypeUnknownException",这样我就可以捕获它,将它添加到一串错误消息中,以便在最后打印出来。但是,当我试图捕获该异常时,编译器说它从未抛出。我明白这是因为它还不知道它可以调用一个抛出我的异常的构造函数,但是是否有一种方法来捕获它,并且只有那个异常(没有捕获所有,它必须抛出其他异常)?
参考: PlayingCard类中的代码:
public PlayingCard(String col, double worth) throws TypeUnknownException{
this(col,(int)worth);
}PlayingCards只接受ints作为它的价值,但是由于类卡必须采用双倍,所以有上面的额外构造函数
public PlayingCard(String col, int w) throws TypeUnknownException{
this.color= Color.getColorWithName(col.toUpperCase());
this.worth= w;}以及枚举颜色中的getColorWithName方法:
public static Color getColorWithName(String name) throws TypeUnknownException{
if(name.equalsIgnoreCase("Spades")){return SPADES;}
else if(name.equalsIgnoreCase("Hearts")){return HEARTS;}
else if(name.equalsIgnoreCase("Clovers")){return CLOVERS;}
else if(name.equalsIgnoreCase("Tiles")){return TILES;}
else throw new TypeUnknownException(name);
}其他一些可能有用的东西:当我在异常的构造函数中添加一个打印时,它能够打印不存在的卡片类型的名称。所以,异常肯定是被抛出的,我只是不知道怎么抓住它。
编辑:由于一条评论,我意识到我忘记提到当捕获InvocationTargetException时,(甚至是所有的捕获)总是给我消息'null‘。
Edit2:答案:问题是getMessage()方法不能在包装类InvocationTargetException上工作。当使用getTargetException().getMessage()时,代码工作正常。感谢用户:207421的帮助。
发布于 2019-12-15 20:03:03
问题是getMessage()方法不能在包装的类InvocationTargetException上工作。我对java API缺乏经验,这让我忽略了这一点。当使用getTargetException().getMessage()时,代码工作正常。感谢https://stackoverflow.com/users/207421/user207421的帮助。
https://stackoverflow.com/questions/59347266
复制相似问题