我写了一个抽象类“ Card”,其中有两个子类“ Sticker”和“ PlayingCard”。类“ PlayingCard”具有一个名为“ Color”属性的枚举对象,该对象基本上说出它是什么类型的牌(红心,黑桃等)。在这个枚举中,我有一个返回基于字符串的对象的方法:如果我将字符串“ spades”传递给它,它将返回一个包含SPADES的对象。如果传递给它的字符串不作为卡类型存在(因此不存在心形,黑桃色...),则会抛出一个自制的“ TypeUnknownException”。此异常仅调用其super(String message)。
现在,当处于另一个类中,该类读取文件并制作Card对象时:
Card c= (Card) Class.forName(one).getConstructor(String.class, double.class).newInstance(two, three);
一个是txt文件中的字符串(始终是已实现的类名,例如Sticker或Playcard,两个是从txt文件中提取的字符串(应该是卡片类型,例如黑桃,但可以不同,应该抛出异常(以此字符串作为消息),并且 3 是从txt文件中解析的双精度字。
这可以从Sticker或PlayingCard调用构造函数。当它从PlayingCard调用构造函数时,它应该可以抛出我的“ TypeUnknownException”,因此我可以捕获它,以将其添加到错误消息字符串中以在末尾打印出来。但是,当我尝试捕获该异常时,编译器表示从未抛出该异常。 我知道这是因为它尚不知道它可以调用引发我的异常的构造函数,但是有没有办法捕获该异常,并且仅捕获该异常(不能捕获所有异常,它必须抛出其他异常)?>
作为参考:PlayingCard类中的代码:
public PlayingCard(String col, double worth) throws TypeUnknownException{
this(col,(int)worth);
}
PlayingCards仅以整数作为其价值,但是由于Card类必须要加倍,因此上面有额外的构造函数
public PlayingCard(String col, int w) throws TypeUnknownException{
this.color= Color.getColorWithName(col.toUpperCase());
this.worth= w;}
和枚举Color中的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的帮助。
答案 0 :(得分:0)
问题是方法getMessage()在包装的类InvocationTargetException上不起作用。我对Java API的缺乏经验使我忽略了这一点。使用getTargetException()。getMessage()时,代码可以正常工作。感谢https://stackoverflow.com/users/207421/user207421的帮助。