抽取方法错误
试图抽取方法时,可能会发生下列的一个或多个常见错误。
所选的块引用了选择之外声明的本地类型
本地类型声明不是选择的一部分,但是为抽取而选择的语句之一引用了它。扩展选择,让它包括本地类型声明,或者减少选择,不选择对本地类型声明的引用。
在选择外部引用了在所选的块中声明的本地类型
选择中包含本地类型声明,但还在所选的语句外部引用了该类型。扩展选择,让它包含对本地类型的所有引用,或减少选择,不选择本地类型声明。
歧义返回值:所选的块中包含本地变量的多个赋值
在所选的块中发现本地变量的多个赋值。减少选择,只选择一个赋值,
或者扩展选择,让该选择至少包含对本地变量的所有引用。
歧义返回值:发现对所选的本地声明的多个引用
在选择外部还引用了在选择内部声明的多个变量。减少选择,只选择一个变量声明,
或扩展选择,让选择至少包含对所选的变量声明的所有引用。
歧义返回值:发现本地变量的赋值以及对所选的本地声明的引用
所选的块中包含对本地变量的赋值。另外,在选择外部还引用了在选择内部声明的变量。减少选择,只选择赋值或本地声明。或者,扩展选择,让选择中还包含对本地变量的所有引用或所有变量声明。
歧义返回值:选择中包含返回语句,并且值必须是从抽取的方法中返回的
所选的块包含返回语句。另外,值必须是从抽取的方法中返回的,
原因是还选择了本地变量的赋值或者本地声明。从选择中排除返回语句,或者从选择中排除对本地变量的所有赋值以及所有本地类型声明。
歧义返回值:表达式具有返回类型,并且值必须是从抽取的方法中返回的
所选的语句是一个表达式(例如,if-then-else 语句的条件部分),它必须返回布尔值。另外,值必须是从抽取的方法中返回的,原因是还选择了本地变量的赋值。要校正该问题,应选择整个语句,而不是只选择条件部分。
选择包含中断语句,但是未选择相应的中断目标
要校正该问题,扩展该选择,使它包含中断/继续目标,
或者减少选择,以便选择不包含中断/继续语句。
选择中包含了继续语句,但是未选择相应的继续目标
要校正该问题,扩展该选择,使它包含中断/继续目标,
或者减少选择,以便选择不包含中断/继续语句。
不能从选择中抽取新方法。只能抽取顶级方法的主体中的语句
这是类属错误消息,每当我们遇到了问题,但实际并不知道问题事实是什么时,就会显示此错误消息。显示此错误消息的典型情况是:
-
选择了整个方法,而不是方法主体的一部分
-
选择中只包含语句的一部分。抽取方法 sense 中的语句是用分号隔开的。在下面的一些示例中,选择中未标记一组语句,因此不能抽取它们:
-
foo().bar().baz();
要校正该问题,选择整个消息发送链
-
int i= foo();
扩展选择,让它包含整个声明
-
另外,对于语句,还可以抽取 if-then-else 语句的整个条件部分。因此,以下选择是有效的:
if (i < 10 && j < 20)
选择整个条件部分来校正该问题。
而选择“if (i < 10 && j < 20)”却不是的。
选择在注释内开始
不能抽取注释的部分。扩展选择,让它包含整个注释,或减少选择,根本不包括注释。
选择在注释中结束
不能抽取注释的部分。扩展选择,让它包含整个注释,或减少选择,根本不包括注释。
不能抽取在语句中间结束的选择
调整选择,使它完全包含一组语句。抽取方法 sense 中的语句是用分号隔开的。
其他问题
下列问题是很显然的。
-
不能抽取单个返回语句。
-
只能抽取空白返回语句。
-
选择在类型声明的中间开始或者结束。选择整个声明或方法主体的语句。
-
不能确定要抽取的表达式的返回类型。
-
不能从 if-then-else 语句的条件部分抽取所选的语句。
-
不能从 do-while 语句的条件部分抽取所选的语句。
-
不能从 while 语句的条件部分抽取所选的语句。
-
选择不能紧跟关键字 do 后面开始。
-
选择必须包含整个 do-while 语句或者包含操作块的一部分。
-
选择必须包含整个 if-then-else 语句或者包含 then 的一部分,或者包含 else 块。
-
不能抽取至新方法,原因是选择在第......行中包含返回语句
-
选择必须包含整个 switch 语句,或者是单个 case 块的一部分。
-
选择必须包含整个同步的语句或者是同步的块的部分。
-
选择必须包含整个 try 语句或者 try、catch 或 finally 块的部分。