0

飛行機のミニ座席表を作成する 2D 配列を作成したいと考えています。これまでのところ、次のようなものを正常に印刷できました。

1A(0) || 1B(0) || 1C(0)

2A(0) || 2B(0) || 2C(0)

3A(0) || 3B(0) || 3C(0)

4A(0) || 4B(0) || 4C(0)

0 は空席を表し、1 は空席を表します。

最初はファースト クラスのクラス変数である配列を使用してプログラムを作成しましたが、このプログラムをエコノミー クラスのセクションで使用できるようにしたいと考えました。2 つのセクションの唯一の違いは配列のサイズなので、コードを次のように編集しました。

public class Seating
 { 
 private int FIRSTCLASS= 12; 
 private int ECONOMYCLASS= 240;
 private int occupied, column;
 private String[][] seatchart;
 private int[][] seatlist;
 private String[][] namelist;
 private String name; 
 public String customer;

public Seating(String seatclass) 
{ 
    seatclass.toUpperCase();
    if (seatclass.equals("FIRSTCLASS"))
    { 
      seatchart= new String[FIRSTCLASS/3][3];
      seatlist= new int[FIRSTCLASS/3][3];
      namelist= new String[FIRSTCLASS/3][3];
    }
    else 
    if (seatclass.equals("ECONOMY"))
    { 
      seatchart= new String[ECONOMYCLASS/3][3];
      seatlist= new int[ECONOMYCLASS/3][3];
      namelist= new String[ECONOMYCLASS/3][3];
    }   

}
public void Creation()
 {
   for (int i=0; i< seatlist.length; i++) 
    {  
        for (int j=0; j<seatlist[i].length; j++) 
        { 
            seatlist[i][j]= 0 ;

        }
    }

どうすればこのエラーを修正できます for (int i=0; i< seatlist.length; i++) か?

前もって感謝します!

4

2 に答える 2

2

コード行が NPE を生成できる唯一の方法は、 if seatlistisnullです。クラス内の別の場所に代入nullしない限り、コンストラクターに渡す引数がまたは. コンストラクターへの呼び出しを確認してください。また、単に使用したい場合もあります。seatlistnullSeating"FIRSTCLASS""ECONOMY"seatclass.equalsIgnoreCase()

コンストラクターを変更して、少なくともその不測の事態について警告する必要があります。これは、のインスタンスが有効な配列を持つことがクラスの適切な操作に不可欠であるためSeatingです。seatlistnamelist

于 2013-04-08T03:05:55.827 に答える
2

問題は次の行にあります。

seatclass.toUpperCase();

それを次のように置き換えます。

seatclass = seatclass.toUpperCase();

「FIRSTCLASS」ではなく「firstclass」のような文字列でクラスを作成していると思いますよね?これらは同じ文字列ではなく、結果を変数に代入せずに文字列に対して toUpperCase メソッドを呼び出してテストするだけでは、何も起こりません。

次に、if 条件が満たされないため、配列は初期化されず、Completion() が呼び出されると null ポインター例外がスローされます。

Java プログラミングが初めてかどうかはわかりませんが、クラスにいくつかの推奨事項を追加したいと思います。

public class Seating {

 private static int FIRSTCLASS= 12;    // Make these constants static since they pertain to all 
 private static int ECONOMYCLASS= 240; // instances of your class. That way there is exactly on
                                       // copy of the variables, which is more memory efficient.
 private int occupied;
 private column;  // Okay but Java convention is to declare each member variable on its own line
                  // increases code readability.
 private String[][] seatchart;
 private int[][] seatlist;
 private String[][] namelist;
 private String locSeatClass;
 private String name;

 public String customer; // Okay but better to leave this private and then provide getter and
                         // setter methods to provide access to this string. Much easier to track
                         // down who is changing its value in your code.

public Seating(String seatclass) { // Java convention is to place the opening bracket here not
                                   // on the next line.  
    // Make sure that seatClass is not null or empty. NOTE: This is a neat trick for
    // simultaneously checking for both null and empty strings in one shot. Otherwise, you have
    // you have to check for null and then examine the string's length which is more code.
    if ("".equalsIgnoreCase(seatClass) {
        throw new IllegalArgumentException("Seat class undefined.");
    }

    // Store the seat class in a member variable for use. Could also be a local variable.
    // My original solution is problematic because it changes the original value of the seat
    // class that was passed into the constructor (you might want that information).
    locSeatClass = seatclass.toUpperCase();

    if (locSeatClass.equals("FIRSTCLASS"))
    { 
      seatchart= new String[FIRSTCLASS/3][3];
      seatlist= new int[FIRSTCLASS/3][3];
      namelist= new String[FIRSTCLASS/3][3];
    }
    else if (locSeatclass.equals("ECONOMY")) { 
      seatchart= new String[ECONOMYCLASS/3][3];
      seatlist= new int[ECONOMYCLASS/3][3];
      namelist= new String[ECONOMYCLASS/3][3];
    }
    else {
        // Throw an exception if someone passes in an unknown seat class string.
        throw new IllegalArgumentException("Unknown seat class detected.")
    }  

}

public void creation() { // NOTE: Java convention is to begin method names with a lower 
                         // case letter.

   // This method is unnecessary. Arrays of integers are initialized with an initial value
   // of zero by default. However, if you want to make your class reusable, you could change
   // change the name of the this method to clear, which would allow you to clear the arrays of
   // an existing object.
   for (int i=0; i< seatlist.length; i++) 
    {  
        for (int j=0; j<seatlist[i].length; j++) 
        { 
            seatlist[i][j]= 0 ;

        }
    }

}

于 2013-04-08T03:09:47.827 に答える