Java 错误和语法教程
-
05-07-2019 - |
题
我请求有关自助的帮助,这是一种矛盾。我如何通过解决更多我自己的问题来减少对你们好人的打扰?
我已经进入了 Java 编程的最后一周,在学习 Java 方面我遇到了巨大的障碍。我读过所有的书,但我总是被一些小问题所困扰。这就像尝试建造一座纸牌屋。我只知道书中展示的部分语法和用法。当我组合事物时,我遇到了可怕的障碍。我尝试了几个小时的修补来弄清楚它们。sun 文档仅显示基本用途,似乎没有帮助
这是我想要的:
当我尝试某些操作并且它不像以下数组列表操作那样工作时,我想找到一个位置或程序来显示示例代码,例如向 arrayList 添加额外的类实例。我在哪里可以简洁地了解这一点,而不必针对每个语法错误提出一个或两个问题?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<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD
private int numDVDs;
public Inventory()
{// method Inventory
dvdlist = new ArrayList<RatedDVD>();
}// 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 < n-search; i++)
{// for step through comparison for entire dvdlist
if (dvdlist.get(i).getName().compareToIgnoreCase(dvdlist.get(i+1).getName()) > 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 < dvdlist.size(); i++) {
if (get(i).getItem() > numb) {
numb = get(i).getItem();
}
}
return numb;
}
}// end class inventory
解决方案
dvdlist
是 ArrayList ,实现收藏接口,不是数组(BTW,这就是所谓的<!>“程序到接口,而不是实现<!>”原则,你应该将java.util.List
作为RatedDVD
作为ArrayList
):
private ArrayList<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD
查看Collection接口上的方法,您将找到添加和删除元素所需的一切。
所以,要添加一个add(Object o)
,你不需要使用一个remove(Object o)
的临时数组,它不会像你在这里那样适合contains(Object o)
:
// 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;
}
相反,只需在<=>上调用<=>方法。
要删除<=>实例,请使用<=>上的<=>方法。
对于search()方法,请考虑在<=>上使用<=>。
如果您需要迭代集合,请使用迭代器:
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
}
真的,你需要挖掘收藏框架。
其他提示
编译器错误似乎很好地描述了您做错的事情,但我可以理解为什么您可能对如何正确做事感到困惑。您似乎误解了 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<RatedDVD>(temp);
。
至于您的持续问题:有一个 API规范 Java基本上告诉您如何使用Java API中包含的所有类。例如, ArrayList 是一个通用集合它有一些你需要使用的方法和构造函数。 Java没有运算符重载,因此您不能仅使用数组语法访问List中的元素。此外,数组是它们自己的数据类型,因此您不能将ArrayList视为数组,反之亦然。
看起来你对数组和ArrayList之间的区别感到困惑。数组是元素的静态列表,使用[]符号构造。 ArrayList是Java中Collections系统中的一个对象,其作用类似于可以修改大小的数组 - 即它可以被索引到,可以被添加到,插入等等。它们不可互换。
至于你在哪里可以看,等等。如果这是你的第一次编程经验,你并不孤单。许多编译器错误都没有用。一个建议我可以告诉你,我通过多年的试验和错误学到了 - 从小开始并积累起来。获取编译的主要方法。然后添加第一个小块(例如创建一个类)。然后添加下一个,依此类推。随你测试,等等。你可以谷歌特定编译器错误 - 我已经惊讶于我发现。除此之外,很多都是反复试验 - 这些是你从经验中学到的东西,以及<!>“旧手<!>”的很多速度。来自于一次又一次地看到你可以做错什么的长期经验,而不是任何先天智慧。我完全理解你的挫败感 - 当我大约15年前开始时,我就有这种感觉了(但我在Borland Pascal - yuck)。
程序员似乎遇到的最大问题之一就是无法很好地阅读和解释错误信息。
通过仔细检查javac
(或任何编译器/解释器)提供的错误,您将获得良好的服务。也许甚至可以从您在代码中理解的错误开始(即,为变量分配不正确的类型值,将循环扩展到边界之外)并查看编译器如何处理这些错误。
尝试以面向对象的方式思考......
在我看来,某些事情(我猜测,上课工作)已经迫使你去编写一个面向对象的程序,但是你可能还没有接受你需要用这些术语思考。
在Java中,大多数东西都是对象,但Java支持原始类型和两者的数组。可以用平面,程序,可变的方式在Java中编程,但也可以以面向对象的功能方式编写。有可能做到这两点而感到困惑,这就是你现在所处的位置。
你正试图混合这两种风格。这并不总是一件坏事,但对于课程作业,我们可以安全地打赌您的教师希望看到更多对象和更少数组,除非这些数组是对象的私有内部实现。
因此,将数据结构视为带方法的黑盒子,然后看看你正在做什么就是自己实现一个。
你可能来过这里,但这些是您可以使用ArrayList做的事情。你有一个ArrayList<RatedDVD>
进一步限制你可以用它做什么。首先尝试理解这一点,然后修复程序以使用ArrayList对象上的可用操作。