【问题标题】:Tutorials for Java errors and syntaxJava 错误和语法教程
【发布时间】:2009-09-09 22:26:48
【问题描述】:

我在寻求自助方面的帮助,这有点矛盾。我如何通过解决更多我自己的问题来少打扰你们这些好人?

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

【问题讨论】:

  • 好标题编辑!谢谢!
  • 嗯,你指的程序也存在:它叫人脑 :) 更严重的是,你不明白提供的例子中的问题吗?
  • 我知道它需要一个数组来分配 temp ,但我正在使用一个 arrayList 并且我不想改变它。那么如何将新 DVD 分配给 arrayList。我不明白。我不想将其更改为在其他地方引起更多问题的数组。我的大脑有太多错误。颅内丢包。我需要更好地解决这个问题,我猜编译错误不够详细或指向正确的方向
  • 问题是编译器消息只有在你理解了语言的基本概念之后才会变得有用。有没有人真正通过首先看他们的正式语法来学习编程语言?任何人?曾经吗?
  • @rmeador,我同意它们是正确的,除非您已经了解该语言的语法,否则它们没有帮助。换句话说,如果您不知道根本问题是什么,那么错误不会教育您。那是我的观点。一旦你知道了语法,那么具体的错误可能有助于理解违反语法的具体方式,没错,但它无助于你到达那里。它是由高级程序员(编译器编写者)编写的高级消息。

标签: java arraylist compiler-errors


【解决方案1】:

dvdlist 是一个ArrayList,它实现了Collection 接口,而不是一个数组(顺便说一句,这被称为“程序到接口,而不是实现”原则,你应该声明@987654326 @作为java.util.List):

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

看看 Collection 接口上的方法,你会发现添加和删除元素所需的一切。

因此,要添加RatedDVD,您不需要像您在这里所做的那样使用一个不适合ArrayList 的临时数组RatedDVD

// 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) 方法。

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

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

如果您需要遍历集合,请使用Iterator

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

现在使用 Java 5+ 和泛型甚至更快:

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

真的,你需要挖掘Collection Framework

【讨论】:

    【解决方案2】:

    编译器错误似乎可以很好地描述您做错了什么,但我可以理解为什么您可能会对如何正确做错感到困惑。您似乎误解了 ArrayList 的使用方式。如果您查看docs,您会看到它具有add()remove() 方法,它们执行您为add()delete() 方法创建的操作。您试图将 ArrayList 视为原始数组。不要那样做;使用 API 提供的方法。这不仅可以解决您的错误,还可以让您的代码对未来的程序员更清晰、更清晰。

    【讨论】:

    • 你会创建一个方法还是只使用调用者的内置操作?
    • 我认为最佳做法是让您的类实现这些方法并简单地调用(委托给)其 dvdlist 成员上的适当方法。 Inventory 类的用户不需要知道它有一个 ArrayList 类型的成员。
    【解决方案3】:

    其实编译错误很明显:

    /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的部分。

    【讨论】:

      【解决方案4】:

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

      其他人在您的特定语法问题上击败了我,所以我的回答仅限于您如何获得帮助的一般性问题。

      【讨论】:

      • 酷。我下载了eclipse,但它并不直观,也就是说,一旦我启动了程序,我不小心跳过了令人困惑的花哨的向导前端,当我打开下一个屏幕时,不清楚下一步该做什么。我放弃了它,认为它需要太多的学习(我承认我没有像我应该尝试的那样投入它)
      • IDE 受苦于试图取悦更多高级程序员,并希望您对如何构建项目有一些了解,但只需在 Eclipse 中创建一个新项目(文件->新建-> 项目)并选择一个 java 项目。并尽可能选择默认值。第一次就够用了。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          至于您可以在哪里查看等。如果这是您的第一次编程体验,那么您并不孤单。许多编译器错误无济于事。我可以给你的一个建议是我通过多年的反复试验学到的——从小处着手,逐步建立。获取编译的主要方法。然后添加第一个小块(例如创建一个类)。然后添加下一块,依此类推。随时进行测试等。您可以搜索特定的编译器错误 - 我对我的发现感到惊讶。除此之外,很多都是反复试验——这些都是你从经验中学到的东西,“老手”的很多速度来自于一次又一次地看到你会做错什么的长期经验,而不是任何某种与生俱来的智慧。我完全理解你的沮丧——大约 15 年前我刚开始工作时就有这种感觉(但我当时在 Borland Pascal 上——太糟糕了)。

          【讨论】:

            【解决方案8】:

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

            仔细检查javac(或任何编译器/解释器)提供的错误会很好。甚至可以从在代码中犯一些您理解的错误开始(例如,将错误的类型值分配给变量,将循环扩展到边界之外),然后看看您的编译器如何处理这些错误。

            【讨论】:

              【解决方案9】:

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

              在我看来,有些东西(我猜是课业)促使你编写面向对象的程序,但你可能还没有接受你需要以这些方式思考。

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

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

              因此,可以将数据结构视为带有方法的黑匣子,然后看看您在做什么是如何自己实现的。

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

              【讨论】:

              • 所以没有魔法按钮!?有人应该制作一个神奇的按钮。或者像计算器。用我的计算器,我可以忘记我的乘法表。这就是我希望我拥有的。一个计算器,但带有指向乘法表的链接。因为这是明天到期的。我想了解更多。只是。不是。对。现在。 Studentoffortune.com 对我来说太放任自流了。我喜欢编程,尽管我也讨厌它。我相信你知道我的意思。
              • 如果你在你的问题上悬赏,我会为你做功课,否则“是的,这是我的最终答案”。 :-)
              猜你喜欢
              • 2013-07-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多