需要协助编译基本java程序的错误

时间:2011-08-11 23:39:59

标签: java

我是Java的新手。我在编译基本的java程序时遇到了问题,我正在努力理解为什么。 (请注意,我正在研究的书中使用代码中的TextIO类来简化IO过程,我不相信这就是问题所在。这是我的代码:

public class ProcessSales {
    public static void main(String[] args) {

        String      ln;
        String      tmp;
        int         i;
        int         noval;

        TextIO.readFile("sales.dat");

        while (TextIO.eof() == false){
            ln = TextIO.getln();
            for (i = 0; i < ln.length(); i++) {
                if (ln.charAt(i) == ':'){
                    tmp = ln.subString(i + 1);  
                }   
            } // end line for loop

            try {
                System.out.printf("%8.2f\n", Double(tmp.trim()));
            }
            catch (NumberFormatException e) {
                noval++;
            }
        } // end of file while loop

        System.out.printf("\nThere were a total of %d cities that didnt have data\n", noval); 

    } // end of main subroutine
} // end of ProcessSales class

我得到的编译错误如下:

[seldon@PrimeRadiant Exercises]$ javac ProcessSales.java
ProcessSales.java:15: cannot find symbol
symbol  : method subString(int)
location: class java.lang.String
                    tmp = ln.subString(i + 1);  
                            ^
ProcessSales.java:20: cannot find symbol
symbol  : method Double(java.lang.String)
location: class ProcessSales
                System.out.printf("%8.2f\n", Double(tmp.trim()));
                                             ^
2 errors

我已将ln声明为String个对象。对于subString对象,String方法直接来自java api。我不明白为什么我收到cannot find symbol编译错误,特别是如果它列出了错误下面的方法签名和位置。

我将问题标记为,因为我正在编写一本教科书,我希望了解这个问题,而不是一个扁平的解决方案。然而,这是自学,而不是任何实际课程的一部分(现在)。

4 个答案:

答案 0 :(得分:8)

Java编译器的优点是,它为您提供了大量信息,可用于确定代码中存在问题的位置。对你来说,第一个问题就在这里:

tmp = ln.subString(i + 1);

在这种情况下,你将一封你不应该拥有的字母大写。它应该是:

tmp = ln.substring(i + 1);

每当您看到编译器输出“无法找到符号”时,由于语法错误或缺少依赖性,Java编译器无法找到与输出名称匹配的方法。对于您的第二个问题,您没有发布相应的代码,但是从错误消息中我发现您错过了new关键字。

System.out.printf("%8.2f\n", Double(tmp.trim()));

应该是

System.out.printf("%8.2f\n", new Double(tmp.trim()));

如果这不是您的第一个编程语言,那么我建议使用像Eclipse这样的IDE,因为它会为您提供自动完成和语法检查。这是一个很好的工具,可以快速学习该语言的API。但是,如果Java是你的第一种编程语言,请继续进行,而不是手持,因为这些困难会更快地巩固教训。

答案 1 :(得分:3)

我还没有验证过这些,我只是查看了源代码和错误消息。

第一个错误似乎是个案错误。 Java String类没有subString方法,它有substring方法,请注意小写s。 Reference

如果您使用new DoubleDouble.valueof代替Double,则可能会解决第二个错误。这是因为您可能正在尝试构造一个新的Double对象,并且在Double类中使用new运算符或valueof方法为您执行此操作。 Reference

答案 2 :(得分:1)

在Java中,方法名称区分大小写。请使用String API规范检查正确的“外壳”。

答案 3 :(得分:0)

关于你的第一个错误,你有一个错字。它应该是ln.substring(i+1)而不是ln.subString(i+1)。 Java中的所有源代码文本都区分大小写。

关于第二个错误,您需要使用new关键字来实例化Double对象。没有new,编译器不会查找构造函数;相反,它正在您的ProcessSales类中寻找方法Double,但无法找到它。