0

このプログラムをコンパイルしようとすると、21行目に「到達不能ステートメント」エラーが表示されます。

import java.util.*;
import java.io.*;
import java.nio.file.*;
import java.lang.StringBuilder;

class FilePrep {
    public static void main(String args[]) {
    }
    public String getStringFromBuffer() {
        try {
            Path file = Paths.get("testfile2.txt");
            FileInputStream fstream = new FileInputStream("testfile2.txt");
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));  
                String inputLine = null;                    
            StringBuffer theText = new StringBuffer();  

            while((inputLine=br.readLine())!=null) {
                theText.append(inputLine+" ");
            }
            return theText.toString();
            System.out.println(theText); // <-- line 21
        }
        catch (Exception e)
        {
            System.err.println("Error: " + e.getMessage());
            return null;
        }
    }
}

完全なコンパイラ出力は次のとおりです。

Main.java:21: error: unreachable statement
            System.out.println(theText);
            ^
Main.java:28: error: missing return statement
    }
    ^
2 errors

ステートメントは適切な場所にあると思いますreturn...少なくとも私にはそうです、そしてプログラムは私がそれを複製したものと比較してとても単純に見えるので、なぜこれがなぜか理解するのに本当に苦労していますステートメントに到達できません。

コードをコピーしているときに何を間違えましたか?また、どのように修正する必要がありますか?

4

5 に答える 5

8

あなたはあなたの問題がここにあると仮定して正しかった:

return theText.toString();
System.out.println(theText);

return関数はメソッドを終了ます。つまり、メソッドを超えるコード行は実行されません。印刷を通過させたい場合は、returnステートメントの上に移動する必要があります。

于 2012-07-15T02:49:40.530 に答える
3

returnステートメントの後にステートメントがあります。これが2つの問題のある行です:

return theText.toString();
System.out.println(theText);

それらを切り替えます。

System.out.println(theText);
return theText.toString();
于 2012-07-15T02:48:45.957 に答える
2

ステートメントが実行されると、メソッドはreturn呼び出し元に制御を放棄します。そのため、printlnは実行されません。そのため、コンパイラは文句を言います。

到達不能ステートメントは、プログラムの論理エラーの確実で信頼できる指標です。これは、実行されないステートメントを入力することを意味しますが、実行されると想定します。コンパイラーはフローを分析し、これらのステートメントをエラー・メッセージとして報告します。

于 2012-07-15T02:49:19.417 に答える
1

printステートメントはreturnステートメントの後にあります。関数は、printステートメントに到達する前に常に終了します。「到達不能」

        return theText.toString(); 
        System.out.println(theText); 

2行の順序を入れ替えると、機能します。

于 2012-07-15T02:49:59.243 に答える
1

ステートメントはreturn常に定義ブロックの最後または最後の行にある必要があります。ステートメントの後にreturnステートメントを保持すると、それらのステートメントはコントローラーから到達不能なステートメントになります。ステートメントを使用することによりreturn、制御は明示的に呼び出し元に戻る必要があることを示しています。

例えば

public class Z
{
    public int test()
    {
        System.out.println(10);
        return 10;
        System.out.println(20);
    }
}

この例ではunreachable code、制御が実行のために最後のステートメントに到達できないため、コンパイル時エラーが発生します。

したがって、alwaysreturnステートメントは定義ブロックの最後のステートメントである必要があります。

于 2012-07-15T06:48:16.847 に答える