Java错误和语法教程

时间:2009-09-09 22:26:49

标签: java arraylist compiler-errors

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

我在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<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

9 个答案:

答案 0 :(得分:5)

dvdlistArrayList,它实现Collection接口,而不是数组(BTW,这被称为“接口程序,而不是实现”原则,你应该将dvdlist转换为java.util.List):

private ArrayList<RatedDVD> 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;
}

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

要删除RatedDVD个实例,请使用remove(Object o)上的dvdlist方法。

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

如果您需要迭代集合,请使用Iterator

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

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

/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 tutorials - 尽管它们非常全面,也可以作为查找语言细节的参考。还有一节关于conversion between collections and arrays

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

要理解某些编译器错误的含义,有一篇名为Compile and Runtime Errors in Java(PDF)的文章会介绍不同类型的错误消息,并提供可能导致它们的代码类型的示例。至于运行时错误消息,Java Glossary有quite a big list of them。他们也有a list of compile-time error messages

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

尝试以面向对象的方式思考......

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

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

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

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

你可能来过这里,但these are the things that you can do with an ArrayList。你有ArrayList<RatedDVD>进一步限制你可以用它做什么。首先尝试理解这一点,然后修复程序以使用ArrayList对象上的可用操作。