有 Java 编程相关的问题?

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

java Eclipse:提取方法功能失败

为了提高冗长方法的可读性,我想用一个方法替换一个重复使用的代码块(仅赋值)。因此,我选择了代码块并运行了Eclipse的提取方法功能,但由于以下错误而失败:

Ambiguous return value: Selected block containsmore than one assignment to local variables. Affacted variables are:

int foo
double[] bar

我怎样才能解决这个问题?它应该是一个简单的void方法,用于完成一些赋值,我不确定Eclipse(3.6.2)会抱怨什么


共 (2) 个答案

  1. # 1 楼答案

    Eclipse需要所有用作参数的变量,并返回一个或不返回在提取的块中修改过的变量

    您的问题是一个类似于

    void f2() {
            int a,b;
            int foo=0;                           // selection start
            double[] bar = new double[10];
            for ( int i = 0 ; i < bar.length ; i++ ) {
                bar[i] = foo;
            }
            foo = 0;                             // selection end
    
            a = foo;
            b = (int) bar[0];
        }
    

    因为这两个变量(foo,bar)在进一步的语句中都是必需的,所以它们不能作为一个值返回。 您可以返回一个包含foo和bar的类

    将它们声明为成员变量是有效的

    public class Refactor {
        int foo ;
        double[] bar; 
    
        void f2() {
            for ( int i = 0 ; i < bar.length ; i++ ) {        // selection start
                bar[i] = foo;
            }
            foo = 0;                                          // selection end
        }
    }
    

    除此之外:

    void f2() {
            int foo=0;                                  // selection start
            double[] bar = new double[10];
            for ( int i = 0 ; i < bar.length ; i++ ) {
                bar[i] = foo;
            }
            foo = 0;                                    // selection end
        }
    
  2. # 2 楼答案

    这些只是赋值还是声明?因为它们看起来像是声明。当您试图将它们提取到方法中时,变量将仅在新方法中可见,因此Eclipse希望返回它们,使它们在调用块中可用

    如果可能,可以将变量设置为全局变量(即成员变量),然后将赋值代码放入额外的方法中

    编辑:

    正如stacker指出的,Eclipse希望返回在新方法中修改的所有变量。由于Java使用按值调用,这对于基元类型是必要的。因为对它们的指定仅在提取的方法中可见,而在外部不可见