Javaエラーと構文のチュートリアル
-
05-07-2019 - |
質問
私はセルフヘルプに関するヘルプを求めています。これは一種の矛盾表現です。私自身の問題をもっと解決することで、素敵な人たちのバグを減らすにはどうすればいいですか?
私はJavaプログラミングの最後の週にいますが、Javaの学習に大きなハードルがあります。私はすべての本を読みましたが、私は小さな問題に夢中になり続けています。カードの家を建てようとしているようなものです。私は、構文の一部と、本が示す用途についてのみ知っています。物事を組み合わせるとき、私は恐ろしいハードルに遭遇します。私はそれらを理解するために何時間もいじくり回します。 sunのドキュメントには、役に立たないと思われる基本的な使用法のみが示されています
これが私が望むものです:
何かを試しているときに、次の配列リストの操作のように機能しない場合、arrayListに追加のクラスインスタンスを追加するなどのコード例を表示できる場所またはプログラムを見つけたいです。構文エラーごとに質問や2をする必要なく、どこでこれについて簡潔に学ぶことができますか? Java for Googleはどこにありますか?エラーを受け取り、修正方法を示す(または提案を提供する)プログラムはありますか?
/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です。 Collection インターフェース、配列ではありません(ところで、これは、<!> quot;原理ではなく、インターフェースへの<!> quot;プログラムとして知られています;原則、java.util.List
をRatedDVD
としてデカレする必要があります):
private ArrayList<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD
Collectionインターフェースのメソッドを見ると、要素の追加と削除に必要なものがすべて見つかります。
したがって、ArrayList
を追加するために、ここでやっているようにadd(Object o)
に収まらないremove(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;
}
代わりに、contains(Object o)
で<=>メソッドを呼び出すだけです。
<=>インスタンスを削除するには、<=>で<=>メソッドを使用します。
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()
メソッドを作成した操作を実行するメソッドdelete()
および<=>があることがわかります。 ArrayListを生の配列であるかのように処理しようとしています。それをしないでください。 APIが提供するメソッドを使用します。これによりエラーが解決されるだけでなく、将来のプログラマーにとってコードがよりクリーンで明確になります。
実際には、コンパイラエラーは非常に明確です:
/tmp/jc_4083/Inventory.java:101: incompatible types
found : RatedDVD[]
required: java.util.ArrayList
dvdlist = temp;
<!> quot;互換性のない型<!> quot;そしてjava.util.ArrayList
を期待していましたが、代わりにRatedDVD[]
を見つけました。
あなたの問題は、Pythonのような言語とは異なり、Javaはリストと配列を交換可能に扱わないことです。これらは完全に異なるものです-配列は特別な言語レベルの構成要素であり、ArrayList
は他のクラスと同様です。
したがって、可変リスト型に配列を割り当てることはできません。プログラム全体でこれら2つのタイプのいずれか1つのみを使用するか、java.util.Arrays.asList()
やList.toArray()
などのメソッドを使用して手動で変換する必要があります。
非常に高度なことを速すぎようとしているようです-おそらくSunの Javaチュートリアル-非常に包括的であり、言語の詳細を検索するためのリファレンスとしても使用できます。 コレクションと配列間の変換。
IDE(完全に無料のEclipseなど)を使用することをお勧めします。入力時に提案を行うことでAPI構文を支援し、入力時にエラーを表示するので、正確な構文エラーを正確に特定して質問することができます。尋ねるという点では、それがStackOverflowの目的です。
他の人があなたの特定の構文の質問に私を打ち負かしたので、私はあなたの助けを得る方法の一般的な質問への私の答えを制限しています。
コンパイラエラーを解決するには、通常、最初のエラーから始めて修正するのが最善です。それを修正すると、残りのコンパイラエラーも解決されるか、異なる種類のエラーになる可能性があります。
コンパイラエラーの意味を理解するために、コンパイルと呼ばれる記事があります。 Javaのランタイムエラー(PDF)。さまざまな種類のエラーメッセージを通過し、どのような種類のコードがエラーを引き起こす可能性があるかの例を示します。また、ランタイムエラーメッセージに関しては、Java Glossaryにはそれらの大きなリストがあります。また、コンパイル時エラーメッセージのリストもあります。
したがって、ここでの問題は、配列のようなArrayListにアクセスしようとしていることです。Javaはそのようなことをしないため、これは正しくありません。配列のi番目の要素を取得するには、list.get(i)を使用する必要があります。同様に、ArrayList変数を配列に設定しようとすると、コンパイラーはあなたを怒らせました。 tempの内容で新しいArrayListを作成してから、dvdlistをそれに設定する必要があります。 dvdlist = new ArrayList<RatedDVD>(temp);
。
継続的な問題について: API仕様があります基本的にJava APIに含まれるすべてのクラスの使用方法を説明するJava。たとえば、 ArrayList は汎用コレクションです使用する必要がある特定のメソッドとコンストラクターがあります。 Javaには演算子のオーバーロードがないため、配列構文を使用してリスト内の要素にアクセスすることはできません。また、配列は独自のデータ型であるため、ArrayListを単に配列として扱うことはできません。逆も同様です。
配列とArrayListの違いについて混乱しているようです。配列は要素の静的リストであり、[]シンボルを使用して構築されます。 ArrayListは、サイズ変更可能な配列のように動作するJavaのコレクションシステム内のオブジェクトです。つまり、インデックスを付けたり、追加したり、挿入したりすることができます。これらは交換できません。
どこで見ることができるかなど。これが最初のプログラミングの経験であれば、あなたは一人ではありません。多くのコンパイラエラーは役に立たない。私が長年の試行錯誤を通して学んだことをあなたに与えることができる一つの提案-小さく始めて積み上げてください。コンパイルするメインメソッドを取得します。次に、最初の小さな部分を追加します(たとえば、クラスを作成します)。次に、次のピースを追加します。特定のコンパイラエラーをグーグルで検索できます-私が見つけたものに驚きました。それを超えて、それの多くは試行錯誤です-これらは経験から学ぶものであり、<!> quot;古い手<!> quot;生まれつきの知性のようなものではなく、何度も何度も間違ったことをすることができるかを見るという長い経験から来ています。私はあなたの不満を完全に理解しています-私は今から約15年前に始めたとき、そのように感じました(しかし、私はBorland Pascalにいました-うん)。
プログラマーが抱えていると思われる最大の問題の1つは、エラーメッセージを適切に読み取って解釈できないことです。
javac
(または任意のコンパイラ/インタープリター)が提供するエラーを慎重に調べることで、十分に対応できます。おそらく、コードで理解しているいくつかの間違いを犯すことから始めて(つまり、変数に誤った型付けされた値を割り当て、境界を超えてループを拡張する)、コンパイラがこれらを処理する方法を確認してください。
オブジェクト指向の用語で考えてみてください...
何か(クラスワーク、私が推測する)がオブジェクト指向プログラムの作成にあなたを押し付けたように思えますが、それらの用語で考える必要があることをまだ受け入れていない可能性があります。
Javaでは、ほとんどのものがオブジェクトですが、Javaはプリミティブ型と両方の配列をサポートしています。 Javaでフラットで手続き型の可変的な方法でプログラミングすることは可能ですが、オブジェクト指向の機能的な方法で記述することもできます。両方を行うと混乱する可能性があります。これが今あなたがいる場所です。
2つのスタイルをミックスしようとしています。これは必ずしも悪いことではありませんが、授業のために、より多くのオブジェクトとより少ない配列を表示したい場合は、それらの配列がオブジェクトのプライベート内部実装でない限り、ファームに安全に賭けることができます。
したがって、データ構造をメソッドを備えたブラックボックスと考えて、自分がどのように実装しているかを自分で確認してください。
おそらくここにいるはずですが、これらはArrayListでできること。そして、あなたはそれで何ができるかをさらに制限するArrayList<RatedDVD>
を持っています。最初にこれを理解してから、ArrayListオブジェクトで使用可能な操作で動作するようにプログラムを修正してください。