为什么我在Java中收到无法访问的语句错误?

时间:2012-07-15 02:45:40

标签: java file-io compiler-errors

当我尝试编译this program时,第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陈述是在正确的位置......它们似乎至少对我来说,与我克隆它的程序相比,程序看起来如此简单从中,我很难弄清楚为什么这句话无法达到。

复制代码时我做错了什么,我该如何纠正?

5 个答案:

答案 0 :(得分:8)

你是对的,假设你的问题在这里:

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

return函数将终止您的方法,这意味着不会执行任何代码行。 如果您希望打印件通过,则应将其移至返回语句上方。

答案 1 :(得分:3)

你在return语句后面有一个声明。 这是两个违规行:

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

切换它们。

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

答案 2 :(得分:2)

执行return语句时,该方法放弃对其调用者的控制。这就是println无法运行的原因;这就是编译器抱怨的原因。

无法到达的语句是程序中逻辑错误的某些可靠指标。这意味着你输入了不会被执行的语句,但你认为它们会被执行。编译器分析流,并将这些语句作为错误消息报告给您。

答案 3 :(得分:1)

print语句出现在 return 语句之后。该函数将在到达print语句之前始终退出。 “不可到达”

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

切换两条线的顺序,它将起作用。

答案 4 :(得分:1)

return语句始终应位于定义块的结尾或最后一行。如果在return语句之后保留任何语句,那么这些语句是控制器无法访问的语句。通过使用return语句,我们告诉控件应该明确地返回其调用者。

例如

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

在此示例中,我们将编译时错误视为unreachable code,因为控件无法访问最后一条语句以供执行。

因此,始终return语句应该是定义块的最后一个语句。