Java 如何获取引发自定义异常的类的名称

Java 如何获取引发自定义异常的类的名称,java,custom-exceptions,Java,Custom Exceptions,我正在为大学准备一个项目,我需要编写一个定制的异常,当同一个包中的几个类没有正确初始化时,它们将抛出该异常。问题是,我必须让用户知道哪些类没有正确初始化(并抛出异常)。。。所以我在想这样的事情: class InitializationException extends Exception { private static final String DEFAULT_MSG = "This " + CLASSNAME-THROWINGME + " had not been

我正在为大学准备一个项目,我需要编写一个定制的异常,当同一个包中的几个类没有正确初始化时,它们将抛出该异常。问题是,我必须让用户知道哪些类没有正确初始化(并抛出异常)。。。所以我在想这样的事情:

class InitializationException extends Exception {

private static final String DEFAULT_MSG =
            "This " + CLASSNAME-THROWINGME + " had not been initialized properly!";

    protected String msg;

InitializationException() {
    this.msg = DEFAULT_MSG;
}

    InitializationException(String msg) {
    this.msg = msg;
}
}
public class InitializationException extends Exception {

    public InitializationException(Class<?> throwingClass) { ... }

    ...
}
(顺便说一句,可以通过反射来实现吗?

看看。每个
stackTraceeElement
都有一个。您可以查看元素
[0]
来确定异常的起源。

查看。每个
stackTraceeElement
都有一个。您可以查看元素
[0]
来确定异常的起源。

类似于:

StackTraceElement[] trace = theException.getStackTrace();
String className = trace[0].getClassName();
(虽然我不太确定您是想要跟踪中的第一个元素还是最后一个元素。)

(请注意,您可以创建一个Throwable并对其执行getStackTrace(),而不必抛出它,以找出谁给您打电话(这将是trace element 1)。

类似于:

StackTraceElement[] trace = theException.getStackTrace();
String className = trace[0].getClassName();
(虽然我不太确定您是想要跟踪中的第一个元素还是最后一个元素。)

(请注意,您可以创建一个Throwable并在其上执行getStackTrace(),而无需抛出它,以找出谁给您打电话(即trace element 1)。

这是一个解决方法:

您可以在构造函数中传递类名,比如

throw new  InitializationException(getClass().getName());
或者可能被称为类

throw new InitializationException(this);
并在excpetin类中处理名称提取

 InitializationExcpetion(Object context){ 
this.name = getClass().getName() 
}
这是一个解决办法:

您可以在构造函数中传递类名,比如

throw new  InitializationException(getClass().getName());
或者可能被称为类

throw new InitializationException(this);
并在excpetin类中处理名称提取

 InitializationExcpetion(Object context){ 
this.name = getClass().getName() 
}

我只是将抛出类传递给构造函数,如下所示:

class InitializationException extends Exception {

private static final String DEFAULT_MSG =
            "This " + CLASSNAME-THROWINGME + " had not been initialized properly!";

    protected String msg;

InitializationException() {
    this.msg = DEFAULT_MSG;
}

    InitializationException(String msg) {
    this.msg = msg;
}
}
public class InitializationException extends Exception {

    public InitializationException(Class<?> throwingClass) { ... }

    ...
}
公共类初始化异常扩展异常{
公共初始化异常(类throwingClass){…}
...
}

我只需将抛出类传递给构造函数,如下所示:

class InitializationException extends Exception {

private static final String DEFAULT_MSG =
            "This " + CLASSNAME-THROWINGME + " had not been initialized properly!";

    protected String msg;

InitializationException() {
    this.msg = DEFAULT_MSG;
}

    InitializationException(String msg) {
    this.msg = msg;
}
}
public class InitializationException extends Exception {

    public InitializationException(Class<?> throwingClass) { ... }

    ...
}
公共类初始化异常扩展异常{
公共初始化异常(类throwingClass){…}
...
}
。 抛出新的InitializationException(“出现了问题”,这是)


抛出新的InitializationException(“出现了问题”,这是)

答案是您强制抛出异常的类告诉异常它是哪个类:

public class InitializationException extends Exception {

    public InitializationException(Class<?> c) {
        super( "The class " + c.getName()+ " had not been initialized properly!");
    }
}
公共类初始化异常扩展异常{
公共初始化异常(c类){
super(“类“+c.getName()+”未正确初始化!”);
}
}

答案是您强制引发异常的类告诉异常它是哪个类:

public class InitializationException extends Exception {

    public InitializationException(Class<?> c) {
        super( "The class " + c.getName()+ " had not been initialized properly!");
    }
}
公共类初始化异常扩展异常{
公共初始化异常(c类){
super(“类“+c.getName()+”未正确初始化!”);
}
}

您可以扩展
异常
并为
.class
添加一个字段(如果是导致异常的类型)。或者您也可以为每个class…创建一个异常,反射在这里几乎肯定不是一个好主意。看看堆栈跟踪。你可以扩展
异常
,并为
.class
添加一个字段(如果是导致异常的类型)。或者你可以为每个类创建一个异常……而且,反射在这里几乎肯定不是一个好主意。看看堆栈跟踪。你想要第一个。API说,“数组的第0个元素(假设数组的长度不为零)表示堆栈的顶部,这是序列中的最后一个方法调用。一般来说,这就是这个垃圾被创建和扔出去的时候,@DilumRanatunga-是的,我本来会想出来的,但我是在比赛中打败你的。但是没有成功。这是一个很好的提示,关于不可回收的
可丢弃的
。回答了一个由来已久的问题“如果一个异常被实例化但从未抛出,那么是否真的存在异常?”答案是“只有在您调用getStackTrace()来确认它的存在时”:)您想要第一个异常。API说,“数组的第0个元素(假设数组的长度不为零)表示堆栈的顶部,这是序列中的最后一个方法调用。一般来说,这就是这个垃圾被创建和扔出去的时候,@DilumRanatunga-是的,我本来会想出来的,但我是在比赛中打败你的。但是没有成功。这是一个很好的提示,关于不可回收的
可丢弃的
。回答了一个由来已久的问题“如果一个异常被实例化但从未抛出,那么是否真的存在异常?”答案是“只有在您调用getStackTrace()来确认它的存在时”:)
getEnclosuringClass()
用于内部类。如果构造异常的类不是内部类,则该类将为
null
。请参见
getEnclosuringClass()
用于内部类。如果构造异常的类不是内部类,则该类将为
null
。看见