我知道这个问题已经被问了一百万遍了,但是我不确定我是否有需要的解决方案。这个问题很可能会回答“否”,但我愿意接受其他解决方案。
我正在实现自己的Exception类,该类是从另一个也实现Iterable的类扩展的。
class TCBPackageException extends TCBRuntimeException implements Iterable<TCBRuntimeException> {
private List<TCBRuntimeException> exceptions = new LinkedList<>();
TCBPackageException(Throwable t) {
super(t);
}
class TCBPackageIterator extends Iterator<TCBRuntimeException> {
public boolean hasNext() {
...
}
public TCBRuntimeException next() {
...
}
}
public void addException(TCBRuntimeException e) {
exceptions.add(e);
}
// Here's My ISSUE
// When getMessage() is Called on TCBPackageException I want the accumulation of all the messages stored.
@Override
public String getMessage() {
StringBuffer buffer = new StringBuffer(super.getMessage());
for (TCBException ex : exceptions) {
buffer.append(ex.getMessage());
}
return buffer.toString();
}
// If I use an Iterator and end up getting this as the FIRST object, I just want the message of THIS exception.
public String getMessage() {
return super.getMessage();
}
答案 0 :(得分:1)
来自https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html
Java编程语言支持重载方法,并且Java可以区分具有不同方法签名的方法。这意味着,如果类中的方法具有不同的参数列表,则它们可以具有相同的名称(对此有一些限定条件,将在标题为“接口与继承”的课程中进行讨论)。
考虑到这一点,您不能定义两个具有绝对相同签名的方法(@Override之类的注释不属于签名)。如果您定义两个方法getMessage()
而没有任何区别,则编译器将不知道您正在尝试o.getMessage()
调用哪个方法。
您必须使用不同的名称或定义不同的参数集。提案:
@Override
public String getNestedMessages() {
StringBuffer buffer = new StringBuffer(super.getMessage());
for (TCBException ex : exceptions) {
buffer.append(ex.getMessage());
}
return buffer.toString();
}
第二种方法getMessage()
绝对是过时的,因为如果不重写它,则会自动从超类中调用它。