-2

これが私のコードです:

ゲッター、セッター、およびインポートは除外されます

部品クラス:

public class Part{
    private String name;
    private String id;
    private int quantity;
    private BigDecimal purchaseprice;
    private BigDecimal saleprice;
    private ArrayList<String> subparts;
    private String description;

    public Part(String File, String ID)
    {
        Part TempP = DataAccess.getPart(File, ID);
        this.name = TempP.name;
        this.id = TempP.id;
        this.quantity = TempP.quantity;
        this.purchaseprice = TempP.purchaseprice;
        this.saleprice = TempP.saleprice;
        this.subparts = TempP.subparts;
        this.description = TempP.description;
    }

    public Part(){}

    public Part(String name, String id, int quantity, BigDecimal purchaseprice,
            BigDecimal saleprice, ArrayList<String> subparts, String description) {
        this.name = name;
        this.id = id;
        this.quantity = quantity;
        this.purchaseprice = purchaseprice;
        this.saleprice = saleprice;
        this.subparts = subparts;
        this.description = description;
    }

データ アクセス クラス:

public class DataAccess
{    
    public static ArrayList<Part> getAllParts(String aFile){
        ArrayList<Part> PartList = new ArrayList<Part>();
        try{
            BufferedReader fin = new BufferedReader(new FileReader(aFile));
            while(true){
                String TempS[];
                TempS = fin.readLine().split(",");
                if(TempS[0] == null){break;}
                ArrayList<String> subparts = new ArrayList<String>();
                for(int i = 6; i < TempS.length; i++){
                    subparts.add(TempS[i]);
                }
                PartList.add(new Part(TempS[1], TempS[0],Integer.valueOf(TempS[2]),BigDecimal.valueOf(Double.valueOf(TempS[3])),BigDecimal.valueOf(Double.valueOf(TempS[4])),subparts,TempS[5]));
            }
            fin.close();
            return PartList;
        }catch(FileNotFoundException ex)
        {
            return PartList;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return PartList;
    }

したがって、問題は、ヒットPartList.add(new Part(TempS[1], TempS[0],Integer.valueOf(TempS[2]),BigDecimal.valueOf(Double.valueOf(TempS[3])),BigDecimal.valueOf(Double.valueOf(TempS[4])),subparts,TempS[5]));してからスローするまで計画どおりに完全に実行されることClassNotFoundExceptionです.Eclipseデバッガーを介して完全にトレースし、すべてのデータが正しいです...誰かが私が間違ったことを教えてもらえますか? 私のコードに対する他の提案もいただければ幸いです...

Exception in thread "main" java.lang.NullPointerException
    at DataAccess.getAllParts(DataAccess.java:42)
    at MainController.SummonParts(MainController.java:38)
    at MainController.main(MainController.java:11)

デバッガーは、クラッシュする前に 48 行目の ClassNotFound エラーを読み取ります...

4

3 に答える 3

0

私が思いついたことの 1 つは、ループを中断する条件付きの場合は内部に依存していることです。whileその代わりに、次のようなループの一部としてテストを使用できます

BufferedReader fin = new BufferedReader(new FileReader(aFile));
String line = fin.readLine();
while (line != null) {
  //execute code here
  line = fin.readLine();
}

これは、ループ内で null 値を使用することを心配する必要がなく、while ループ内でその break ステートメントを取り除くことができるため、優れています。

さらに、インポート ステートメントに,およびクラスがあることは確かですか? 新しい を作成できない場合、その行に NPE がスローされます。BufferedReaderFileReaderPartPart

Partオブジェクトにアクセスできるかどうかをテストするには:

Part newPart = new Part(/*add all constructor args*/);
if (newPart != null) {
  System.out.println("Non-null Part");
  partList.add(newPart);
}

コンソール出力が表示された場合、部品オブジェクトがリストに追加されています。そうでない場合は、そこにエラーがあります。

于 2013-05-17T03:32:44.290 に答える
0
  • 6マジックナンバーです。記号定数で置き換えます。0実際、1、 などについても同じことを行います。
  • あなたはまだ Java 命名規則に従っていません:
    • 変数はキャメルケースです。
    • クラスは大文字でキャメルケースです。
    • 列挙型は ALL_CAPS_WITH_UNDERSCORES です。
  • あなたの名前はより具体的であるべきです。彼らが扱うオブジェクトのタイプについては何も言いません TempSDataAccess
    • おそらくPartDAO代わりにDataAccess
    • おそらくpartData代わりにTempS
  • そして、静的をあまり使用しないでください。メソッドmainにオブジェクトを初期化し、作業を行うように指示します。このようにして、メソッドをテスト可能な小さなものに分割できます。
  • ストリームをfinallyブロックで閉じるか、Java 7 の try-with-resources を使用します。
  • FileNotFoundException無視されるべきではなく、空のリストを返すだけです。
  • よりもロギング システムを優先しe.printStackTrace()ます。を見てくださいlogback
  • ArrayList変数をsとして宣言しないでください。代わりにインターフェイスにプログラムし、それらをLists にします。
  • 列 80 程度を超えないようにコードをフォーマットします。
  • BufferedReader.readLine()nullファイルの終わりで戻ります。そのため、プログラムはファイルの終わりに到達し、 を呼び出しますnull.split(",")
  • アイテムにコンマまたは引用符が含まれているため、エスケープを含む csv ファイルを処理する可能性はありますか? csv ライブラリを見てください。
  • BigDecimal.valueOf(Double.valueOf(TempS[3]))複雑すぎます。実際にBigDecimalは、 を受け取るコンストラクタがあり、これStringを使用することをお勧めします。だから、new BigDecimal(TempS[3])より良いです。一方、ファイル$19.38に代わりに含まれている可能性はあります19.38か? 代わりに見たいかもしれませんMessageFormat
于 2013-05-17T03:23:46.810 に答える