1

私が作成している次のプログラムでは、ユーザーが値を入力してビデオの配列を作成できます。各ビデオには、いくつかのデータ フィールド (番号、タイトル、発行元、期間、日付) が含まれています。プログラムは、主にスイッチ メニューを介して制御されます。ただし、配列を作成した後、[ビデオを表示] などの別のオプションを選択すると、Null ポインター例外がスローされます。これらの例外は通常、配列に値を割り当てていない場合に発生しますが、それは最初のオプション createLibrary() で既に行われているはずです。動画の検索と動画の変更の他の機能にも同じ問題があり、get メソッドを使用するたびに発生します。

合理的な実用的な答えを持っている人なら誰でも大いに役立ちます。

ここに私のコードの一部があります:

import java.util.*;
public class EnterLibrary
{
public final int MAX_ITEMS = 5;
public Library[] videos;
public int size = 0;

public EnterLibrary()
    {
        videos = new Library[MAX_ITEMS];
        java.util.Scanner scannerObject =new java.util.Scanner(System.in);
        LibraryMenu Menu = new LibraryMenu();
        Menu.displayMenu();
        switch (scannerObject.nextInt())
        {
            case 1:
            System.out.println ("1 - Add Videos");
                if (size < MAX_ITEMS) {
                Library video = createLibrary();
                videos[size++] = video;
                }
            new EnterLibrary();
            break;
            case 2:
            System.out.println ("2 - Show Videos");
            printVidLibrary(videos);
            new EnterLibrary();
            break;
            case 3:
            System.out.println ("3 - Search Videos");
            searchLibrary(videos);
            new EnterLibrary();
            break;
            case 4:
            System.out.println ("4 - Change Videos");
            changeLibrary(videos);
            break;      
            case 5:
            System.out.println ("5 - Delete Videos");
            deleteVideo(videos);
            new EnterLibrary();
            break;
            default:
            System.out.println ("Unrecognized option - please select options 1-5 ");
            break;
        }
    }

public Library createLibrary()
{
    Library video = new Library();
    java.util.Scanner scannerObject =new java.util.Scanner(System.in); 
    for (int i = 0; i < videos.length; i++)
    {
    //User enters values into set methods within the Library class
    System.out.print("Enter video number: " + (i+1) + "\n");
    String number = scannerObject.nextLine();
    System.out.print("Enter video title: " + (i+1) + "\n");
    String title = scannerObject.nextLine();
    System.out.print("Enter video publisher: " + (i+1) + "\n");
    String publisher = scannerObject.nextLine();
    System.out.print("Enter video duration: " + (i+1) + "\n");
    String duration = scannerObject.nextLine();
    System.out.print("Enter video date: " + (i+1) + "\n");
    String date= scannerObject.nextLine();
    System.out.print("VIDEO " + (i+1) + " ENTRY ADDED " + "\n \n");
    //Initialize arrays
    videos[i] = new Library ();
    videos[i].setVideo( number, title, publisher, duration, date  );
    }
    return video;
}

public void printVidLibrary( Library[] videos)
{
    //Get methods to print results
    System.out.print("\n***VIDEO CATALOGUE*** \n");
    for (int i = 0; i < videos.length; i++)
    {
    System.out.print("Video number " + (i+1) + ": \n" + videos[i].getNumber() + "\n ");
    System.out.print("Video title " + (i+1) + ": \n" + videos[i].getTitle() + "\n ");
    System.out.print("Video publisher " + (i+1) + ": \n" + videos[i].getPublisher() + "\n ");
    System.out.print("Video duration " + (i+1) + ": \n" + videos[i].getDuration() + "\n ");
    System.out.print("Video date " + (i+1) + ": \n" + videos[i].getDate() + "\n ");
    }
}
//Code for other functions not displayed here

public static void main(String[] args)
    {

    new EnterLibrary();
    }
}

例外エラー:

Exception in thread "main" java.lang.NullPointerException
        at EnterLibrary.printVidLibrary(EnterLibrary.java:80)
        at EnterLibrary.<init>(EnterLibrary.java:26)
        at EnterLibrary.<init>(EnterLibrary.java:22)
        at EnterLibrary.<init>(EnterLibrary.java:22)
        at EnterLibrary.<init>(EnterLibrary.java:22)
        at EnterLibrary.<init>(EnterLibrary.java:22)
        at EnterLibrary.main(EnterLibrary.java:202)
4

3 に答える 3

3

コードに少なくとも 2 つの重大なエラーがあります。

  1. 発生するのを待っているスタック オーバーフローがあります。EnterLibrary()内部EnterLibrary()で呼び出しているため、無限再帰が発生します。
  2. 配列をインスタンス化しましたがvideos、まだ初期化しておらず、null オブジェクトでいっぱいです。を呼び出す前に、のコンストラクターcreateLibrary()の先頭で呼び出すようにしてください。EnterLibraryprintVidLibrary()videos
于 2012-06-19T00:29:28.773 に答える
0

あなたはそれを間違えました、あなたはねじれた心を持っています!

(たとえば、ビデオを追加した後)スイッチをもう一度やり直したいことがわかった場合:新しいを作成するのではなく、スイッチの周りにループを使用する必要があるため、ビデオバージンの「EnterLibrary」オブジェクト。

いくつかのコード:

while (i = scannerObject.nextInt()) {
  switch(i) {
    case 1:
        System.out.println ("1 - Add Videos");
        if (size < MAX_ITEMS) {
          Library video = createLibrary();
          videos[size++] = video;
        }
        break;
    case 2:
        System.out.println ("2 - Show Videos");
        printVidLibrary(videos);
        break;
    case 3:
        System.out.println ("3 - Search Videos");
        searchLibrary(videos);
        break;
    case 4:
        System.out.println ("4 - Change Videos");
        changeLibrary(videos);
        break;      
    case 5:
        System.out.println ("5 - Delete Videos");
        deleteVideo(videos);
        break;
    default:
        System.out.println ("Unrecognized option - please select options 1-5 ");
        break;
    }
}

余談ですが、私はあまり考えていませんでしたし、今はちょっと疲れていますが、これは OOP の全体的な良い使い方とは思えません。間違っているかもしれませんが、キャッチすることはできませんまず、「EnterLibrary」オブジェクトとは何か。

そして、そうです、bmargulies が示唆するように、デバッガーに慣れてください。彼はあなたの親友だと思います

編集: コードを編集しましたが、再帰呼び出しを削除するのを忘れていました

于 2012-06-19T00:47:09.950 に答える
0

videos = new Library[MAX_ITEMS];ライブラリ項目を初期化しないため、それぞれが null です。これを試して

videos = new Library[MAX_ITEMS];
for(int x = 0; x < MAX_ITEMS; x++)
  videos[x] = new Library();

また、例外を回避するために、ビデオ引数が null の場合、printVidLibrary をチェックインすることもできます。

于 2012-06-19T00:30:22.050 に答える