0

私は Java を初めて使用します。Null ポインター Exceptionが発生する理由を誰か説明できますか? さらに、スキャナー以外の信頼できる入力方法を誰でも説明できます。

エラー

スレッド「メイン」での例外java.lang.NullPointerException

at Theater.main( Theater.java:18 )

import java.util.Scanner;
public class Theater 
{
    public static void main(String[] args) throws Exception 
    {
        int Screen;
        Screens[] X = new Screens[5];
        Scanner input = new Scanner(System.in);
        do
        {
            System.out.println();
            System.out.println(" '0' to exit");
            System.out.println(" '1-5' for Booking Seats");
            System.out.println(" '10' for Displaying Seating Status");
            System.out.println("Enter Screen Number : ");
            Screen = input.nextInt();
            if(Screen >= 1 && Screen <= 4)
                X[Screen-1].bookSeat();
            else if(Screen == 0)
            {
                System.out.println("Thank You for Booking Seats in PVR Cinemas.");
                System.in.read();
                System.exit(0);
            }
        }while(true);

    }
}
class Screens
{
    private
        int[] Gold = new int[3];
        int[] Platinum = new int[3];
        int[] Diamond = new int[3];
        int g,d,p;
        Scanner input = new Scanner(System.in);
        final int MAX=3;
    public  Screens()
    {
        for( int i=0;i<3;i++)
        {
            Gold[i] = 0;
            Platinum[i] = 0;
            Diamond[i] = 0;
            g = d = p = 0;
        }
    }
    public void bookSeat()
    {
        int n=0,choice,i;
        System.out.println("\t\tMenu");
        System.out.println("1.Gold \tAvailable Seats : "+(3-g));
        System.out.println("2.Platinum \tAvailable Seats : "+(3-p));
        System.out.println("3.Diamond \tAvailable Seats : "+(3-d));
        System.out.println("4.Return to Main Menu");
        System.out.println("Your Choice : ");
        choice = input.nextInt();
        if(choice>=1 && choice<=3)
        {
                    System.out.print("How many Seats ? : ");
                    n = input.nextInt();
                    if( n<=0 )
                    {
                        System.out.println("Please Check your Input.");
                        return;
                    }
                    else if( n>=MAX )
                    {
                        System.out.println("The Maximum Number of Seats is : "+MAX);
                    }
        }
        switch(choice)
        {
            case 1:
                if(g+n >3)
                {
                    System.out.println("Housefull!");
                    break;
                }
                else
                {
                    int total = 0;
                    System.out.print("Seat Numbers are : ");
                    for(i=0;i<n;i++)
                    {
                        Gold[g++] = 1;
                        System.out.print("\t"+g);
                    }
                    total = 100 * n;
                    System.out.println("Total Money to be paid : "+total);
                }
            break;
            case 2:
                if(p+n >3)
                {
                    System.out.println("Housefull!");
                    break;
                }
                else
                {
                    int total = 0;
                    System.out.print("Seat Numbers are : ");
                    for(i=0;i<n;i++)
                    {
                        Platinum[p++] = 1;
                        System.out.print("\t"+p);
                    }
                    total = 125 * n;
                    System.out.println("Total Money to be paid : "+total);
                }
            break;
            case 3:
                if(d+n >3)
                {
                    System.out.println("Housefull!");
                    break;
                }
                else
                {
                    int total = 0;
                    System.out.print("Seat Numbers are : ");
                    for(i=0;i<n;i++)
                    {
                        Diamond[d++] = 1;
                        System.out.print("\t"+d);
                    }
                    total = 150 * n;
                    System.out.println("Total Money to be paid : "+total);
                }
            break;
            case 4:
            break;
            default:
                System.out.println("Sorry, That's an invalid Choice!");

        }
        return;
    }
    public void viewSeats()
    {
        int i;
        System.out.println("Gold Category : ");
        for(i=0;i<3;i++)
        System.out.print("\t "+Gold[i]);
        System.out.println("Platinum Category : ");
        for(i=0;i<3;i++)
        System.out.print("\t "+Platinum[i]);
        System.out.println("Diamond Category : ");
        for(i=0;i<3;i++)
        System.out.print("\t "+Diamond[i]);
    }
}
4

7 に答える 7

2

にデータを入力する必要がありますScrrens array。つまり、Scrren 配列を初期化しただけで、その要素を初期化していません。要素を初期化しない場合、この場合はnullであるデフォルト値が取得されます。null に対して何らかのメソッドを呼び出すとどうなるかを推測してください。あなたが得るブームNPE

Screens[] X = new Screens[5];
x[0] = new Screen();
于 2013-03-12T15:13:32.417 に答える
2

配列を初期化しXますが、そのメンバーを初期化しないためX[Screen-1]、null オブジェクトを使用しています (インデックスが境界内にある場合でも)。

于 2013-03-12T15:13:40.670 に答える
2

配列Xには要素が含まれていないため、デフォルトではすべての要素が に初期化されnullます。したがって、基本的にこれを実行しようとするとnull.bookseat()NullPointerException.

Screenif is ever 5(条件で許可されている<= 5) の場合ArrayIndexOutOfBoundsException、配列にはインデックスしかないため0,1,2,3,4(合計 5 つ)が得られることに注意することも重要です。

于 2013-03-12T15:13:52.777 に答える
2

5 つの画面オブジェクトを保持する配列を宣言したが、実際の画面オブジェクトで 5 つのスロットを初期化していないため、NullPointerException が発生します。

したがって、使用しようとすると、

X[Screen-1].bookSeat();

配列内の null 要素を参照しており、もちろん null オブジェクトのメソッドを呼び出すことはできません

オブジェクトを使用する前にチェックを追加して、画面を初期化できます

if(Screen >= 1 && Screen <= 4) {
    if (X[Screen-1] == null) 
       X[Screen-1] = new Screens();

    X[Screen-1].bookSeat();
}

また、あなたの使い方には奇妙なことがあります。配列はインデックス 0 から始まりますが、プログラムを終了する値としてゼロを使用するため、インデックス 0 の要素は使用されません。

于 2013-03-12T15:14:01.827 に答える
2

配列Xは作成されていますが、要素は初期化されておらず、まだ null です。配列が次のように初期化されることを期待していると思います:

Screens[] X = new Screens[5];
for (int x = 0; x < 5; x++) {
    X[x] = new Screens();
}
于 2013-03-12T15:14:24.757 に答える
1

Screens 配列に入力するもう 1 つの方法

Screens[] X = { new Screens(), new Screens(), new Screens(),new Screens(), new Screens() };

コレクションからのリストを使用すると、より便利になる場合があります。

于 2013-03-12T15:51:31.747 に答える
1

結局、Screens[] X = new Screens[5];配列 X の 5 つの要素は null です!!

于 2013-03-12T15:16:14.050 に答える