Java does not allow generic exception classes (JLS ref). That's because of the type erasure. Generic types are not reifiable in catch clauses.
Following will not compile:
package com.logicbig.example;
public class ExceptionGenericClass {
public static class MyException<T> extends Exception {
private final T t;
public MyException(T t) {
super();
this.t = t;
}
public T getT() {
return t;
}
}
public static void process() throws MyException<String> {
throw new MyException<>("test exception");
}
public static void main(String[] args) {
try {
process();
} catch (MyException<String> e) {
System.out.println(e.getT());
e.printStackTrace();
}
}
}
Compile time errors:
com\logicbig\example\ExceptionGenericClass.java:5: error: a generic class may not extend java.lang.Throwable public static class MyException<T> extends Exception { ^1 error
However, generic type parameter can be used in throws clause
package com.logicbig.example;
import java.io.IOException;
import java.util.zip.ZipException;
public class ExceptionGenericTypes {
public static abstract class Task<E extends IOException> {
public abstract void process() throws E;
}
public static class SubTask extends Task<ZipException> {
@Override
public void process() throws ZipException {
throw new ZipException();
}
}
public static void main(String[] args) {
try {
Task<ZipException> a = new SubTask();
a.process();
} catch (ZipException e) {
e.printStackTrace();
}
}
}
On running above class:
java.util.zip.ZipException at com.logicbig.example.ExceptionGenericTypes$SubTask.process(ExceptionGenericTypes.java:16) at com.logicbig.example.ExceptionGenericTypes.main(ExceptionGenericTypes.java:23)