メソッドの抽出エラー
メソッドを抽出しようとすると、以下の共通エラーが 1 つまたは複数発生することがあります。
選択されているブロックが、選択部分の外部で宣言されているローカルの型を参照しています
ローカルの型宣言は選択部分の一部ではないにもかかわらず、
抽出のために選択されたステートメントの 1 つがそれを参照しています。
ローカルの型宣言を含むようにその選択部分を拡張するか、
そのローカルの型宣言への参照が選択されないように選択部分を縮小してください。
選択されているブロックで宣言されているローカルの型が、選択部分の外部で参照されています
選択部分にはローカルの型宣言が含まれてはいますが、
その型は選択されているステートメントの外部でも参照されています。
ローカルの型への参照をすべて含むようにその選択部分を拡張するか、
そのローカルの型宣言が選択されないように選択部分を縮小してください。
戻り値があいまいです: 選択されているブロックには、ローカル変数への複数の代入が含まれています
1 つのローカル変数への複数の代入が、選択されているブロック内で検出されました。
1 つの代入だけが選択されるように選択部分を縮小するか、
そのローカル変数への 1 つの参照を除く少なくともすべての参照も含まれるように、選択部分を拡張してください。
戻り値があいまいです: 選択されているローカル宣言への参照が複数あることが検出されました
選択部分で宣言されている複数の変数が、選択部分の外部でも参照されています。
1 つの変数宣言だけが選択されるように選択部分を縮小するか、
選択されている変数宣言への 1 つの参照を除く少なくともすべての参照も含まれるように、選択部分を拡張してください。
戻り値があいまいです: ローカル変数への代入と、選択されているローカル宣言への参照が検出されました
選択されているブロックに、ローカル変数への代入が含まれています。
さらに、選択部分内で宣言されている変数が、選択部分外でも参照されています。
代入またはローカル宣言のいずれかが選択されるように選択部分を縮小してください。
または、ローカル変数へのすべての参照あるいはすべての変数のいずれかが、
選択部分にも含まれるように、選択部分を拡張してください。
戻り値があいまいです: 選択部分に return ステートメントが含まれており、抽出されたメソッドから値を戻す必要があります
選択されているブロックには、return ステートメントが含まれています。
さらに、ローカル変数への代入またはローカル宣言のどちらかも選択されているので、
抽出されたメソッドから値を戻す必要があります。
選択部分から return ステートメントを除外するか、
ローカル変数へのすべての代入とすべてのローカルの型宣言を選択部分から除外してください。
戻り値があいまいです: 式に戻り型があり、抽出されたメソッドから値を戻す必要があります
選択されているステートメントは、boolean 型を戻さなければならない式です
(たとえば、if-then-else ステートメントの条件部分)。
さらに、ローカル変数への代入も選択されているので、抽出されたメソッドから値を戻す必要があります。
この問題を修正するには、条件部分だけではなくステートメント全体を選択してください。
選択部分に break ステートメントが含まれていますが、対応する break ターゲットが選択されていません
この問題を修正するには、break / continue ターゲットを含むように選択部分を拡張するか、
break / continue ステートメントが選択部分に含まれないように選択部分を縮小してください。
選択部分に continue ステートメントが含まれていますが、対応する continue ターゲットが選択されていません
この問題を修正するには、break / continue ターゲットを含むように選択部分を拡張するか、
break / continue ステートメントが選択部分に含まれないように選択部分を縮小してください。
選択部分から新規のメソッドを抽出することができません。
トップレベルのメソッドの本体のステートメントしか抽出することができません
これは、実際には問題が何なのかがわからない問題を検出した場合に常に表示される汎用のエラー・メッセージです。
このエラー・メッセージが表示される典型的なシナリオを以下に示します。
-
メソッド本体の一部だけではなく、メソッド本体が選択されています
-
選択部分にはステートメントの一部だけが含まれています。
抽出メソッドの意味でいうステートメントは、セミコロンで区切られています。
以下に、選択部分がステートメント・セットをマークしていないために、抽出できない例を示します。
-
foo().bar().baz();
この問題を修正するには、メッセージの送信チェーン全体を選択してください。
-
int i= foo();
宣言全体が含まれるように選択部分を拡張してください。
-
ステートメント以外にも、if-then-else ステートメントの条件部分全体を抽出することもできます。
したがって、以下の選択部分は有効です。
if (i < 10 && j < 20)
この問題を修正するには、条件部分全体を選択してください。
これに対して、選択部分 "if (i < 10 && j < 20)" は無効です。
選択部分がコメント内から開始しています
コメントの一部分を抽出することはできません。
コメント全体を含めるように選択部分を拡張するか、コメントを全く含めないように選択部分を縮小してください。
選択部分がコメント内で終了しています
コメントの一部分を抽出することはできません。
コメント全体を含めるように選択部分を拡張するか、コメントを全く含めないように選択部分を縮小してください。
ステートメントの途中で終了する選択は、抽出することができません
選択部分がステートメント・セットを完全に含むように選択部分を拡張してください。
抽出メソッドの意味でいうステートメントは、セミコロンで区切られています。
その他の問題
以下の問題は、きわめて自明な問題です。
-
単一の return ステートメントを抽出することはできません。
-
void return ステートメントのみ抽出することができます。
-
選択部分は、型宣言の途中で開始または終了しています。宣言全体またはメソッド本体のステートメントを選択してください。
-
抽出する式の戻り型を判別することができません。
-
if-then-else ステートメントの条件部分から選択されたステートメントを抽出することができません。
-
do-while ステートメントの条件部分から選択されたステートメントを抽出することができません。
-
while ステートメントの条件部分から選択されたステートメントを抽出することができません。
-
選択部分は do キーワードの直後に開始することはでません。
-
選択部分には、do-while ステートメント全体、またはアクション・ブロックの一部分のいずれかが含まれていなければなりません。
-
選択部分には、if-then-else ステートメント全体、または then ブロックあるいは else ブロックの一部分のいずれかが含まれていなければなりません。
-
選択部分には、return ステートメント (第...行) が含まれているため、新規メソッドに抽出することができません。
-
選択部分には、switch ステートメント全体、または単一の case ブロックの一部分のいずれかが含まれていなければ なりません。
-
選択部分には、synchronized ステートメント全体、または synchronized ブロックの一部分のいずれかが含まれていなければなりません。
-
選択部分には、try ステートメント全体、また try ブロック、catch ブロック、または finally ブロックの一部分のいずれかが含まれていなければなりません。