2011-08-11 47 views
3

我是Java的新手。我正在编译一个基本的Java程序,我试图理解为什么。 (注意TextIO类中的代码本书使用我学习简化IO过程中,我不相信这正是问题的)这里是我的代码:需要基础java程序的编译错误帮助

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 

编译错误我得到如下:

[[email protected] 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 

伊夫声明lnString对象。对于String对象,subString方法是java api中的直接方法。我不明白为什么我会收到cannot find symbol编译错误,特别是如果它在错误下面列出方法签名和位置。

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

+1

我在做什么'Double'语句错了......我是否需要用'tmp.trim()'语句作为构造函数参数声明一个类型为'Double'的新对象? –

+1

我认为这是最快的IVE曾收到回复...谢谢所有 –

回答

7

关于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

这回答了这两个问题...谢谢你的感知... –

1

在Java中,方法名称区分大小写。请回顾String API规范,了解正确的“套管”。

+1

D'oh!...它是'substring'而不是'subString' ..我发誓我曾多次看过......谢谢Florian –

2

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

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

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

0

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

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