Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以在使用SpringAOP的方法中截获空指针异常吗?_Java_Spring_Spring Aop - Fatal编程技术网

Java 我可以在使用SpringAOP的方法中截获空指针异常吗?

Java 我可以在使用SpringAOP的方法中截获空指针异常吗?,java,spring,spring-aop,Java,Spring,Spring Aop,我们有一组pdf报告类,在大量导入存档数据后,当数据位丢失时,这些类开始偶尔抛出空指针异常,例如thing.getOtherThing.getText;没有其他东西,报告就会被推翻 在我看来,我们有几个选择 修复数据-不太清楚在每种情况下数据应该是什么,在某些情况下是人类判断的问题 将try/catch放在所有地方,并重新抛出一个有用的异常,以向用户显示-大量工作和难看的代码,但对用户有用 将空支票放在所有地方-不,谢谢 使用DAO代码在查询中执行coalesce/nvl,并在缺少的字段或银行中

我们有一组pdf报告类,在大量导入存档数据后,当数据位丢失时,这些类开始偶尔抛出空指针异常,例如thing.getOtherThing.getText;没有其他东西,报告就会被推翻

在我看来,我们有几个选择

修复数据-不太清楚在每种情况下数据应该是什么,在某些情况下是人类判断的问题 将try/catch放在所有地方,并重新抛出一个有用的异常,以向用户显示-大量工作和难看的代码,但对用户有用 将空支票放在所有地方-不,谢谢 使用DAO代码在查询中执行coalesce/nvl,并在缺少的字段或银行中生成不适用的报告-可以,但没有那么有用 或者。。。我们能在这里用AOP做点什么吗?是否可以拦截某些类/方法中抛出的空指针?截获这些信息时,可用的信息级别是什么?请记住,方法中的多个位置可能会抛出空指针:


谢谢。

Uff。。这可能会很痛苦,但我真诚地建议您仔细检查代码,在任何合理的地方检查null,为自己构建一个实用程序类,这样您就可以执行以下操作

MyUtilityHelper.checkNotNull用于检查,elegantMessage

让这个方法抛出一些你能得到更多信息的东西


AOP在这里真的不适用IMHO,你不想用AOP做那些应该用顺序逻辑来做的事情,只是因为代码更适合顺序处理。。。当您想要添加一个水平层的功能时,AOP是合适的,比如安全性、日志记录…

Uff。。这可能会很痛苦,但我真诚地建议您仔细检查代码,在任何合理的地方检查null,为自己构建一个实用程序类,这样您就可以执行以下操作

MyUtilityHelper.checkNotNull用于检查,elegantMessage

让这个方法抛出一些你能得到更多信息的东西


AOP在这里真的不适用IMHO,你不想用AOP做那些应该用顺序逻辑来做的事情,只是因为代码更适合顺序处理。。。AOP适用于需要添加水平功能层的情况,如安全性、日志…

AOP可能会帮助您找到解决方案,但您需要在引发异常之前采取行动,因为异常会导致您丢失太多的执行上下文。首先,当您编写thing.getOtherThing.getText时,getOtherThing是一个具有奇数名称的字段还是一个您意外地忽略了括号的方法调用?如果是后者,您可以使用SpringAOP拦截方法,前提是对象实际上是一个bean。如果没有,您将需要完整的AspectJ,因为SpringAOP不会执行字段访问拦截,因为它是如何实现的

我们的想法是使用@Around来定义切入点,并提供如下建议:

static final OtherThing THE_DEFAULT_VALUE = ...;

@Around("execution(* getOtherThing())")
public Object supplyDefault(ProceedingJoinPoint pjp) throws Throwable {
    Object result = pjp.proceed();
    if (result == null)
        result = THE_DEFAULT_VALUE;
    return result;
}
或者,AspectJ未经测试;实际上,我没有在任何方面使用AspectJ:

aspect ADefaultOtherThing {
    static final OtherThing THE_DEFAULT_VALUE = ...;

    OtherThing around(): get(OtherThing getOtherThing) {
        OtherThing result = proceed();
        if (result == null)
            result = THE_DEFAULT_VALUE;
        return result;
    }
}

尽管如此,我还是怀疑这是否是AOP的一个特别好的用途。当然,将这样的业务逻辑直接放在代码中会更好吗?保证字段永远不为null似乎是一个很好的不变量。

AOP可能会帮助您找到解决方案,但您需要在引发异常之前采取行动,因为异常会导致您丢失太多的执行上下文。首先,当您编写thing.getOtherThing.getText时,getOtherThing是一个具有奇数名称的字段还是一个您意外地忽略了括号的方法调用?如果是后者,您可以使用SpringAOP拦截方法,前提是对象实际上是一个bean。如果没有,您将需要完整的AspectJ,因为SpringAOP不会执行字段访问拦截,因为它是如何实现的

我们的想法是使用@Around来定义切入点,并提供如下建议:

static final OtherThing THE_DEFAULT_VALUE = ...;

@Around("execution(* getOtherThing())")
public Object supplyDefault(ProceedingJoinPoint pjp) throws Throwable {
    Object result = pjp.proceed();
    if (result == null)
        result = THE_DEFAULT_VALUE;
    return result;
}
或者,AspectJ未经测试;实际上,我没有在任何方面使用AspectJ:

aspect ADefaultOtherThing {
    static final OtherThing THE_DEFAULT_VALUE = ...;

    OtherThing around(): get(OtherThing getOtherThing) {
        OtherThing result = proceed();
        if (result == null)
            result = THE_DEFAULT_VALUE;
        return result;
    }
}

尽管如此,我还是怀疑这是否是AOP的一个特别好的用途。当然,将这样的业务逻辑直接放在代码中会更好吗?保证字段永远不为空似乎是一个很好的不变量。

AOP就像一个魔术。遵循这个链接说明——除非是Springbean,否则您需要使用aspectj编译或加载时编织,而不是SpringAOP代理。不一定支持您的解决方案,只是说.AOP就像一个魔术。遵循这个链接说明——除非是Springbean,否则您需要使用aspectj编译或加载时编织,而不是SpringAOP代理。不一定支持您的解决方案,只是说。请记住,SpringAOP示例用于方法调用,AspectJ示例用于字段访问。我错误地在方法名称中插入了括号。然后,SpringAOP的“环绕”建议就可以了。你得弄清楚这是不是一个好主意
或者业务对象是否应该显式地永远不返回null。至于业务逻辑-现在是业务逻辑-新字段不能为null,但有大量已导入的旧存档数据没有此要求-我们需要截取此信息并通知用户。但我怀疑我们是否会使用AOP。另一方面,如果我们使用空检查,那么一旦数据被清除,我们的报告代码中就会有大量无用的空检查。AOP将更容易删除。请记住,SpringAOP示例用于方法调用,AspectJ示例用于字段访问。我错误地在方法名称中插入了括号。然后使用SpringAOP的“环绕”建议就可以了。您只需要弄清楚这是否是一个好主意,或者业务对象是否应该显式地从不返回null。至于业务逻辑-现在是业务逻辑-新字段不能为null,但是,有大量已导入的旧存档数据没有此要求-我们需要截取这些数据并通知用户。但我怀疑我们是否会使用AOP。另一方面,如果我们使用空检查,那么一旦数据被清除,我们的报告代码中就会有大量无用的空检查。AOP将更容易删除。易于添加,易于删除。。。我并不是这样做的人:如何处理异常而不是水平功能?投掷NPE,尤其是以我所描述的方式,听起来相当水平。易于添加,易于删除。。。我并不是这样做的人:如何处理异常而不是水平功能?在我看来,投掷NPE(尤其是以描述的方式)听起来相当水平。