Java错误和语法教程

我在寻求自助方面的帮助,这是一种矛盾。 如何通过解决更多我自己的问题来减少你的好人?

我是Java编程的最后一周,我在学习Java方面面临巨大障碍。 我已经阅读了所有的书籍,但我一直都在忙着处理一些小小的问题。 这就像试图建立一个纸牌屋。 我只知道语法的各个部分以及本书所展示的用途。 当我把事情结合起来时,我遇到了可怕的障碍。 我尝试了几个小时的修修补补。 sun文档仅显示似乎没有帮助的基本用法

这是我想要的:

当我尝试某些东西并且它不像下面对数组列表的操作那样工作时,我想找到一个可以显示示例代码的地方或程序,例如向arrayList添加一个额外的类实例。 哪里可以简明扼要地学习这一点,而不必为每个语法错误提出问题或2? Google for Java在哪里? 是否有一个程序可以解决您的错误并告诉您如何解决它们(或提供建议)?

/tmp/jc_4083/Inventory.java:101: incompatible types found : RatedDVD[] required: java.util.ArrayList dvdlist = temp; ^ /tmp/jc_4083/Inventory.java:110: array required, but java.util.ArrayList found if (p != dvdlist[i]) { ^ /tmp/jc_4083/Inventory.java:111: array required, but java.util.ArrayList found temp[i-adj] = dvdlist[i]; ^ /tmp/jc_4083/Inventory.java:115: incompatible types found : RatedDVD[] required: java.util.ArrayList dvdlist = temp; 

如果有人有兴趣为我查看它,这是我的这个类的代码:

 //Contruct inv and allow for methods add, get, size, sort, and value import java.util.*; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; public class Inventory {// class Inventory private ArrayList dvdlist;// declare dvdlist as ArrayList of RatedDVD private int numDVDs; public Inventory() {// method Inventory dvdlist = new ArrayList(); }// end method // add & get public RatedDVD get(int i){return dvdlist.get(i);}// method get public void add(DVD d){ dvdlist = dvdlist d; sort(); }// method add public double value() {// method value double total = 0.0; for (int i = 0; i < dvdlist.size(); i++) {// for every pass thru dvdlist add total // [DEBUG] consider enhanced for total += get(i).feeValue(); } return total; }// end method value public void sort() {// method sort // [DEBUG] consider optimization int n = dvdlist.size(); for (int search = 1; search < n; search++) {// for do the following and increment till dvdlist has been searched for (int i = 0; i  0) {// if swap necessary then swap RatedDVD temp = dvdlist.get(i); dvdlist.set(i,dvdlist.get(i+1)); dvdlist.set(i+1,temp); }// end if swap }// end for compareto }// end outer for }// end method sort public int size(){return dvdlist.size();}// method size public void save() { save(true); } // save it to C:\data\inventory.dat public void save(boolean saveagain) { try { BufferedWriter w = new BufferedWriter(new FileWriter("c:\\data\\inventory.dat")); for (int i = 0; i < size(); i++) { RatedDVD dvd = get(i); w.write( dvd.getItem() + "\n"); w.write( dvd.getName() + "\n"); w.write( dvd.getRating() + "\n"); w.write( dvd.getUnits() + "\n"); w.write( dvd.getPrice() + "\n"); w.write( dvd.value() + "\n"); w.write( dvd.fee() + "\n"); w.write( dvd.feeValue() + "\n"); w.newLine(); } // total value of it //w.write( value() + "\n"); w.close(); } catch (Exception ex) { if (saveagain) { new File("c:\\data\\").mkdir(); // make file if doesn't exist save(false); } } } public int search(String name) { for (int i = 0; i < size(); i++) { // check if name string is equal if (get(i).getName().equalsIgnoreCase(name)) return i; } return -1; // we didn't find anything } // add a new dvd to the end, increasing the array size public void add(RatedDVD p) { RatedDVD[] temp = new RatedDVD[dvdlist.size()+1]; for (int i = 0; i < dvdlist.size(); i++) { temp[i] = dvdlist[i]; } temp[temp.length-1] = p; // add it at the end dvdlist = temp; } // remove a DVD from the array, and shrink the array size public void delete(RatedDVD p) { RatedDVD[] temp = new RatedDVD[dvdlist.size()-1]; int adj = 0; for (int i = 0; i < dvdlist.size(); i++) { if (p != dvdlist[i]) { temp[i-adj] = dvdlist[i]; } else adj = 1; } dvdlist = temp; } public int highestNumber() { int numb = 0; for (int i = 0; i  numb) { numb = get(i).getItem(); } } return numb; } }// end class inventory 

dvdlist是一个ArrayList ,它实现了Collection接口,而不是一个Array(BTW,这就是所谓的“接口程序,而不是实现”原则,你应该把dvdlist作为java.util.List ):

 private ArrayList dvdlist;// declare dvdlist as ArrayList of RatedDVD 

看看Collection接口上的方法,您将找到添加和删除元素所需的一切。

因此,要添加一个RatedDVD ,您不需要使用一个临时的RatedDVD数组,它无论如何都不适合您在这里执行的ArrayList

 // add a new dvd to the end, increasing the array size public void add(RatedDVD p) { RatedDVD[] temp = new RatedDVD[dvdlist.size()+1]; for (int i = 0; i < dvdlist.size(); i++) { temp[i] = dvdlist[i]; } temp[temp.length-1] = p; // add it at the end dvdlist = temp; } 

相反,只需在dvdlist上调用add(Object o)方法dvdlist

要删除RatedDVD实例,请使用RatedDVDremove(Object o)方法。

对于search()方法,请考虑在dvdlist上使用contains(Object o)

如果需要迭代集合,请使用迭代器 :

 for (Iterator iter = dvdlist.iterator(); iter.hasNext();) { RatedDVD ratedDVD = (RatedDVD) iter.next(); //rest of the code block removed } 

或者现在使用Java 5+和Generics更快:

 for (RatedDVD ratedDVD : dvdlist) { // rest of the code here } 

真的,你需要挖掘Collection Framework 。

编译器错误似乎完全描述了你做错了什么,但我可以理解为什么你可能会对如何正确地做到这一点感到困惑。 您似乎误解了如何使用ArrayList。 如果查看文档 ,您将看到它有方法add()remove() ,它们为您创建的add()delete()方法执行操作。 您正在尝试将ArrayList视为原始数组。 不要那样做; 使用API​​提供的方法。 这不仅可以解决您的错误,还可以使您的代码更清晰,更清晰。

实际上,编译器错误非常明确:

 /tmp/jc_4083/Inventory.java:101: incompatible types found : RatedDVD[] required: java.util.ArrayList dvdlist = temp; 

它说“不兼容的类型”,并且它期望java.util.ArrayList但却找到了RatedDVD[]

问题很简单,与Python这样的语言不同,Java不会互换地处理列表和数组。 它们是完全不同的东西 – 数组是特殊的语言级构造,而ArrayList是一个类似于任何其他类的类。

因此,您无法将数组分配给可变类型列表。 您要么必须决定在整个程序中只使用这两种类型中的一种,要么必须使用java.util.Arrays.asList()List.toArray()等方法手动转换它们。

看起来你正试图做太高级的事情 – 你应该首先看一下Sun的Java教程 – 尽管它们非常全面,也可以作为查找语言细节的参考。 还有一个关于集合和数组之间转换的部分。

我建议你使用IDE(比如Eclipse,完全免费)。 它将通过在您键入时提供建议来帮助您完成API语法,并在您键入时显示错误,以便您可以查明确切的语法错误并询问它们。 在询问方面,这就是StackOverflow的用途。

其他人打败了我的特定语法问题,所以我只是限制我对你如何得到帮助的一般问题的回答。

要解决编译器错误,通常最好从第一个开始并首先修复它。 修复之后,其余的编译器错误也可能会被解决,或者它们可能是不同类型的错误。

要了解某些编译器错误的含义,有一篇名为Java (PDF)中的编译和运行时错误的文章,它介绍了不同类型的错误消息,并提供了可能导致它们的代码类型的示例。 至于运行时错误消息,Java Glossary有很多它们 。 它们还有一个编译时错误消息列表 。

所以,你的问题是你正在尝试像数组一样访问ArrayList,这是不正确的,因为Java不会做那样的事情。 您需要使用list.get(i)来获取Array中的第i个元素。 类似地,当您尝试将ArrayList变量设置为数组时,编译器会生你的气。 您需要使用temp的内容创建一个新的ArrayList,然后将dvdlist设置为,例如。 dvdlist = new ArrayList(temp);

至于你持续存在的问题:有一个Java API规范 ,它基本上告诉你如何使用Java API中包含的所有类。 例如, ArrayList是一个通用集合,它包含您需要使用的某些方法和构造函数。 Java没有运算符重载,因此您不能仅使用数组语法访问List中的元素。 此外,数组是它们自己的数据类型,因此您不能将ArrayList视为数组,反之亦然。

看起来你对数组和ArrayList之间的区别感到困惑。 数组是静态元素列表,使用[]符号构造。 ArrayList是Java中Collections系统中的一个对象,其作用类似于可修改大小的数组 – 即它可以被索引到,可以添加到,插入等等。它们不可互换。

至于你可以在哪里看,等等。如果这是你的第一次编程经验,你并不孤单。 许多编译器错误都没有用。 一个建议我可以告诉你,我通过多年的试验和错误学到了 – 从小开始并积累起来。 获取编译的主要方法。 然后添加第一个小块(例如创建一个类)。 然后添加下一个,依此类推。 随你测试,等等。你可以谷歌特定的编译器错误 – 我已经惊讶于我发现。 除此之外,很多都是反复试验 – 这些都是你从经验中学到的东西,而“老手”的很多速度来自于一次又一次地看到你能做错的长期经验,而不是任何天生的智慧。 我完全理解你的挫败感 – 当我大约15年前开始时,我觉得这样(但我在Borland Pascal – yuck)。

程序员似乎遇到的最大问题之一是无法很好地阅读和解释错误消息。

仔细检查javac (或任何编译器/解释器)提供的错误,您将获得良好的服务。 也许甚至可以从你在代码中理解的一些错误开始(即,为变量分配一个不正确的类型值,将循环扩展到边界之外)并查看编译器如何处理这些错误。

尝试用面向对象的术语思考……

在我看来,某些事情(我猜测,上课工作)已经促使你编写一个面向对象的程序,但你可能还没有接受你需要用这些术语思考。

在Java中,大多数东西都是对象,但Java支持原始类型和两者的数组。 可以用平面,程序,可变的方式在Java中编程,但也可以以面向对象的function方式编写。 有可能做到这两点而感到困惑,这就是你现在所处的位置。

你试图混合这两种风格。 这并不总是一件坏事,但对于课程作业,我们可以安全地打赌您的教师希望看到更多对象和更少数组的服务器场,除非这些数组是对象的私有内部实现。

因此,将数据结构视为带有方法的黑盒子,然后看看你正在做什么就是自己实现一个。

您可能已经来过这里,但这些是您可以使用ArrayList执行的操作 。 你有一个ArrayList ,它进一步限制你可以用它做什么。 首先尝试理解这一点,然后修复程序以使用ArrayList对象上的可用操作。