Tutoriais para erros Java e sintaxe
-
05-07-2019 - |
Pergunta
Eu estou pedindo ajuda na auto-ajuda, que é uma espécie de paradoxo. Como faço para chateá-lo pessoal agradáveis ??menos, resolvendo mais de meus próprios problemas?
Estou na minha última semana de programação Java e estou tendo um grande obstáculo com a aprendizagem de Java. Eu li todos os livros, mas eu continuo ficando pendurado em pequenas questões pequenas. É como tentar construir um castelo de cartas. Eu só sei sobre as partes da sintaxe e os usos que mostra o livro. Quando estou combinando as coisas, eu me deparo com obstáculos terríveis. Eu tento para horas de ajustes para entendê-los. Os docs sol mostrar apenas os usos básicos que não parecem ajudar
Aqui está o que eu gostaria:
Quando eu estou tentando alguma coisa e ele não funciona como as seguintes manipulações de uma lista de matriz, quero encontrar um lugar ou programa que pode mostrar código de exemplos de coisas como a adição de uma instância da classe adicional para um ArrayList. Onde posso aprender de forma concisa sobre isso sem ter que fazer uma pergunta ou 2 para cada erro de sintaxe? Onde está o Google para Java? Existe um programa que vai levar os seus erros e mostrar-lhe como corrigi-los (ou oferecer sugestões)?
/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;
Aqui está o meu código para esta classe se alguém está interessado em olhar para mim:
//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
Solução
O dvdlist
é um ArrayList , que implementa o Collection interface, não um array (BTW, e isso é conhecido como o "programa para uma interface, não uma implementação" princípio, você deve decalare dvdlist
como um java.util.List
):
private ArrayList<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD
Tenha um olhar para os métodos na interface coleção, você vai encontrar tudo que você precisa para adicionar e remover elementos.
Assim, para adicionar um RatedDVD
, você não precisa usar uma matriz temporária de RatedDVD
que não vai caber qualquer maneira em um ArrayList
como você está fazendo aqui:
// 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;
}
Em vez disso, basta chamar o método add(Object o)
em dvdlist
.
Para excluir uma instância RatedDVD
, use o método remove(Object o)
em dvdlist
.
Para o método search (), considere o uso contains(Object o)
em dvdlist
.
Se você precisar iterar sobre uma coleção, use um Iterator :
for (Iterator iter = dvdlist.iterator(); iter.hasNext();) {
RatedDVD ratedDVD = (RatedDVD) iter.next();
//rest of the code block removed
}
Ou ainda mais rápido agora com Java 5 + e Genéricos:
for (RatedDVD ratedDVD : dvdlist) {
// rest of the code here
}
Realmente, você precisa cavar a Colecção quadro .
Outras dicas
Os erros do compilador parecem ser bastante descritivo do que você está fazendo errado, mas eu posso ver porque você pode estar confuso sobre como fazer isso direito. Você parece estar mal-entendido como um ArrayList é feito para ser usado. Se você olhar para o docs , você vai ver que tem métodos add()
e remove()
que fazer as operações que você criou métodos add()
e delete()
para. Você está tentando tratar o ArrayList como se fosse uma matriz cru. Não faça isso; utilizar os métodos fornecidos pela API. Não só isso vai resolver seus erros, mas ele vai fazer seu código mais limpo e mais claro para os programadores futuras.
Na verdade, o erro do compilador é muito clara:
/tmp/jc_4083/Inventory.java:101: incompatible types
found : RatedDVD[]
required: java.util.ArrayList
dvdlist = temp;
Ele diz "tipos incompatíveis" e que esperava uma java.util.ArrayList
mas encontrou, em vez de um RatedDVD[]
.
Seu problema é simplesmente que, ao contrário de linguagens como Python, Java faz listas não tratar e matrizes alternadamente. São coisas completamente diferentes - matrizes são construções especiais em nível de linguagem, enquanto ArrayList
é uma classe como qualquer outro
Então, você não pode atribuir uma matriz a uma variável do tipo lista. Você tem que decidir sobre o uso apenas um desses dois tipos em todo o seu programa, ou você tem que converter entre eles manualmente, usando métodos como java.util.Arrays.asList()
e List.toArray()
.
Parece que você está tentando fazer as coisas muito avançadas muito rápido - você provavelmente deve olhar de Sun tutoriais Java primeiro - embora eles são bastante abrangente e também pode ser usado como referência para procurar detalhes de linguagem. Há também uma seção sobre conversão entre coleções e arrays .
Eu sugiro que você use um IDE (como o Eclipse, inteiramente livre). Ela irá ajudá-lo através da sintaxe API fazendo sugestões enquanto você digita, e mostrar-lhe os erros quando você digitá-los, de modo que você pode identificar erros de sintaxe exatas e perguntar sobre eles. Em termos de perguntar, isso é o que StackOverflow é para.
Outros bater-me à sua pergunta sintaxe específica, por isso estou apenas limitando minha resposta à questão geral de como você obter ajuda.
Para resolver erros do compilador, geralmente é melhor começar com o primeiro e corrigi-lo primeiro. Depois de corrigir isso, o resto dos erros do compilador pode também ser resolvido, ou eles podem ser diferentes tipos de erros.
Para entender o que alguns meios de erro do compilador, há um artigo chamado Compilar e Erros de tempo de execução em Java (PDF) que passa por diferentes tipos de mensagens de erro e dá exemplos de que tipo de código pode causar-lhes. E quanto a mensagens de erro de tempo de execução, Java Glossary tem bastante uma grande lista deles . Eles também têm uma lista de tempo de compilação mensagens de erro .
Então, o problema aqui é que você está tentando acessar um ArrayList como um array, que é incorreta porque Java não faz coisas assim. Você precisa usar list.get (i) para obter o elemento om em uma matriz. Da mesma forma, quando você tentou definir uma variável de ArrayList para uma matriz, o compilador ficou com raiva de você. Você precisa criar um novo ArrayList com o conteúdo de temperatura e, em seguida, definir dvdlist para que, por exemplo. dvdlist = new ArrayList<RatedDVD>(temp);
.
Como para os seus problemas continuaram: Há um API Specification para Java que lhe diz basicamente como usar todas as classes que estão incluídos na API Java. Por exemplo, ArrayList é uma coleção genérica que tem certos métodos e construtores que você precisa usar. Java não tem sobrecarga de operadores, para que você não pode apenas elementos de acesso em uma lista usando a sintaxe de array. Além disso, as matrizes são o seu próprio tipo de dados para que você não pode apenas tratar um ArrayList como uma matriz e vice-versa.
Parece que você está confuso sobre a diferença entre uma matriz e um ArrayList. Uma matriz é uma lista de elementos estática, e é construída usando os símbolos []. Um matrizes é um objecto no sistema Colecções em Java que actua como uma matriz de tamanho modificável -. Isto é, pode ser indexado em, e pode ser adicionado para, inserida no, etc Eles não são intermutáveis ??
Como para onde você pode olhar, etc. Se esta é sua primeira experiência em programação, você não está sozinho. Muitos erros do compilador são menos do que útil. Uma sugestão que pode dar-lhe que eu aprendi através de muitos anos de tentativa e erro - começar pequeno e construir. Obter um método main que compila. Em seguida, adicione a primeira peça pouco (criação de uma classe, por exemplo). Em seguida, adicione a próxima peça, e assim por diante. Teste como você vai, etc. Você pode google para determinados erros do compilador - I foram surpreso com o que eu encontrei. Além disso, um lote de que é tentativa e erro - estas são coisas que você aprende com a experiência, e um monte da velocidade de "velhos mãos" vem da longa experiência de ver o que você pode fazer sobre o errado e outra vez, e não qualquer tipo de inteligência inata. Eu entendo totalmente sua frustração - eu me senti assim quando eu estava começando para fora cerca de 15 anos agora (mas eu estava em Borland Pascal - eca).
Um dos maiores problemas que começam programadores parecem ter não é ser capaz de ler e interpretar mensagens de erro muito bem.
Você estaria bem servido por examinar com cuidado os erros que javac
(ou qualquer compilador / intérprete) fornece. Talvez até mesmo começar por fazer alguns erros que você entenda em seu código (ou seja, atribuir um valor digitado incorreto a uma variável, estender um laço além dos limites) e ver como seus punhos do compilador estes.
Tente pensar em orientadosa termos ...
Parece-me que algo (classwork, eu acho) levou você a escrever um programa orientado a objeto, mas é possível que você ainda não aceitaram que você terá que pensar nesses termos.
Em Java maioria das coisas são objetos, mas Java suporta tipos primitivos, e matrizes de ambos. É possível programar em Java em um apartamento, maneira processual, mutável, mas também possível escrever de uma forma funcional orientada a objetos. É possível fazer as duas coisas e ficar confuso, que é onde você pode ser agora.
Você está tentando misturar os dois estilos. Isso nem sempre é uma coisa ruim, mas para cursos podemos seguramente apostar a fazenda que seu instrutor vai querer ver mais objetos e menos matrizes, a menos que essas matrizes são a implementação interna privada de um objeto.
Então, pense das estruturas de dados como caixas pretas com métodos e, em seguida, ver como o que você está fazendo está implementando um você mesmo.
Você provavelmente tem sido aqui, mas estes são as coisas que você pode fazer com um ArrayList. E você tem uma ArrayList<RatedDVD>
que mais restringe o que você pode fazer com ele. Tente entender isso primeiro, e depois corrigir o programa para trabalhar com as operações disponíveis em um objeto ArrayList.