有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

向任何java异常添加属性

我想通过添加一个属性来定制java异常类。它可以像以下属性一样简单:

boolean isThisStupid;

void setIsThisStupid(boolean iValue);
boolean getIsThisStupid();

每次我实例化一个异常,比如NullPointerException或IllegalArgumentException,它都会包含这个属性

由于我没有Java的源代码,我当然不能编辑异常基类

我考虑过使用decorator模式,使用一个实现IEException接口的“ExceptionCorator”类,但是,这样做会丢失我不想要的初始异常类型。例如:

IException mException = new ExceptionDecorator( new NullPointerException() );

我会得到:

mException instanceof ExceptionDecorator; //true
mException instanceof NullPointerException; //false

我希望我的自定义异常是NullPointerException的实例

这是完全通用的,我希望它能与Exception的任何子类一起工作

这可能吗?如果是,也许有一种模式可以帮助我,但我不知道

我已经尽了最大努力澄清,如果我不清楚,请询问更多细节,我将重新表述最初的主题

谢谢


共 (4) 个答案

  1. # 1 楼答案

    谢谢你们的回答,似乎没有什么能真正满足我的需要。所以我可能只是改变我的想法,而不是强迫别人做一些会让人尴尬、无法维护的事情

  2. # 2 楼答案

    要让exception类扩展NullPointer,请执行以下操作:

    public MyNewException extends NullPointerException
    {
        /*define methods and variables*/
    }
    

    要让一个类与exception的任何子类一起工作,您必须按如下方式定义它:

    public MyNewException extends Exception
    {
        /*define stuff*/
    }
    

    如果这不是你想做的,请告诉我

  3. # 3 楼答案

    I want my custom exception to be an instance of NullPointerException.

    这在编译时是不可能的。要想做你想做的事情,你应该在运行时用Javasist动态创建你的异常类

    否则,对于静态类型,可以使用decorator。装饰者必须使用与装饰对象相同的接口/类。它是装饰师的底座

    在您的情况下,基类不能是您创建的新接口,因为您不能更改现有异常的代码。所以装饰器和装饰对象之间的共同抽象类是Exception

    你可以有一个这样的装饰师:

    public class DecoratorException extends Exception{
    
       private Exception decorated;
       private boolean isStupid;
    
       public DecoratorException(Exception exception){
         this.decorated = exception;
       }
    
       public void setStupid(boolean iValue){
          // TODO
       }
       public boolean getStupid{}{
          // TODO
       }
    
       // get effective exception
       public Exception getEffectiveException(){
         return decorated;
       }
    
       // decorate the method you wish 
       // for example toString()
       public String toString(){
           return  decorated.toString() + ", isStupid=" + isStupid);
       }
    
    }
    

    Decorator的理念是向装饰对象添加行为
    在我的示例中,我修饰了toString()方法,用它的值显示新字段

    然后你可以提出这样一个例外:

    Exception e = new DecoratorException(new IllegalArgumentException());
    e.setStupid(true);
    throw e;
    
  4. # 4 楼答案

    我认为这里最好的选择是继续使用您描述的decorator模式,而不是使用instance of,在异常类(#containsInstanceOf或其他什么)中创建另一个方法,并在代码中使用它来检查包含的类型

    我认为添加您想要的行为的唯一方法是像Lombok那样处理字节码,或者创建代理对象。这两种模式都非常混乱,使用decorator模式处理instance of不起作用的事实可能更容易