Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.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中是否从catch块调用了相同的方法?_Java - Fatal编程技术网

如何确定在java中是否从catch块调用了相同的方法?

如何确定在java中是否从catch块调用了相同的方法?,java,Java,我有一个方法,例如,void abc(){},这个方法直接从我的main()方法以及它的异常块(即catch块)调用 现在,我想在abc()方法中了解abc()是正常调用(即从main())还是在异常情况下调用(即从catch()块) 我使用Thread.getCurrentStackTrace()尝试了这个方法,但是它总是返回main()方法(作为方法名),因为在这两种情况下,方法总是保持不变 这里重要的一点是,我不能更改abc()方法的签名,也不能在main()方法或catch()块中设置任

我有一个方法,例如,
void abc(){}
,这个方法直接从我的
main()
方法以及它的异常块(即catch块)调用

现在,我想在
abc()
方法中了解
abc()
是正常调用(即从
main()
)还是在异常情况下调用(即从
catch()
块)

我使用
Thread.getCurrentStackTrace()
尝试了这个方法,但是它总是返回
main()
方法(作为方法名),因为在这两种情况下,方法总是保持不变

这里重要的一点是,我不能更改abc()方法的签名,也不能在main()方法或catch()块中设置任何标志,有了这些限制,我试图找出,如何检查从哪里调用abc()或简单地说……如何找出abc()方法中是否抛出异常


请建议

您可以将一个布尔参数传递给您的方法,让它知道从何处调用它

public static void abc(boolean isError)
{
    if (isError) {
        // method was called from catch block
    }
}

public static void main (String[] args)
{
    try {
        ...
        abc(false);
        ...
    }
    catch (Exception exc) {
        abc(true);
    }
}

我可以想出一些解决办法:

  • 使用
    abc()
    的附加输入,检测方法调用的位置。如果要在发生错误时更改方法abc的功能,请使用此方法

  • 使用日志。在您看到错误的地方打印日志。我推荐这种方法,因为您的方法签名保持不变

  • 在类中添加一个静态变量(如布尔值),并在发生错误时设置此变量,然后在
    abc
    中检查此变量


  • 可以向方法中添加字符串参数:

    public static void method (String msg)
    {
    
    }
    
    public static void someOtherMethod(){
        method("calling from someOtherMethod");
    }
    
    public static void main (String[] args)
    {
        try {
            method("calling from main");
        }
        catch (Exception exc) {
            method("an exception is thrown" );
        }
    
       someOtherMethod(){
       }
    }
    

    getCurrentStackTrace()显然不起作用,因为无论是从main调用它还是从catch调用它,在这两种情况下线程都将保持不变

    除了这些选项之外,首先您可以按照@Eran的建议进行操作,我不会重复这个答案,如果您不想更改方法签名,那么您可以做的另一件事是在从catch block调用abc()之前设置/取消设置布尔变量。。参见下面的示例

    private static boolean isCalledFromCatch = false;
    public static void method ()
    {
        if(isCalledFromCatch){
            //Catch specific processing here
        }else{
            //main specific processing here
        }
    }
    
    public static void main (String[] args)
    {
        try {
          isCalledFromCatch = false;
            abc();
        }
        catch (Exception exc) {
            isCalledFromCatch = true;
            abc();
        }
    }
    
    但是,如果一个函数需要从
    try
    catch
    同时调用,最好从
    finally
    块调用它。这样,您就不需要从两个不同的位置调用它。

    使用,您可以获得行号,从行号可以确定是否从
    main()
    的catch块调用了
    abc()
    。 看见 这与您已经尝试过的方法类似,但您会得到行号

    注意:只有当您有main方法的源代码来查看行号时,这才有效。如果main位于源代码不可用的外部jar中,则无法工作


    编辑:另外,如果创建外部jar时没有行号调试信息,则此操作将不起作用。

    添加一些日志语句如何?或者通过调试器检查?谢谢你们的更新。这里的问题是我不能更改void abc()的签名,因为它是框架代码,不允许更改!你为什么要这个?Java中没有任何东西可以识别从
    catch
    块调用方法,因为从JVM的角度看,在
    catch
    块内部的代码和不在
    catch
    块内部的代码没有区别。不可能。谢谢你们的更新。这里的问题是我不能更改void abc()的签名,因为它是框架代码,不允许更改!如果它是在没有行号调试信息的情况下编译的,它也不会工作。如果在main块上方或main try和catch块之间添加了新的代码行,它会继续工作吗?是的,只要您使用的jar是从您引用的相同源代码创建的,它就会工作。若jar被更新,你们需要参考相应的更新源代码,反之亦然。