1

オブジェクトの Arraylist にオブジェクトを追加する私の静的メソッド。

public static void addObject() {
    int id;
    String name;

    try{
        System.out.print("Id: ");
        id = Integer.parseInt(sc.next());

        System.out.print("Name: "); //when the program gets here, he just skips back to my main class...
        name = sc.nextLine();

        Object o = new Object(id, name);
        l.addObject(o); //adds the object to this list (l) of objects
    }
    catch(NumberFormatException nfe){
        System.out.println("Not a valid id!");
        addObject();
    }   
}

オブジェクトを追加、削除、編集するdo-while-loopのスイッチを含む私のメインメソッド。

public static void main(String[] args){
    int choice; 
    do{ 
        try{
            choice = Integer.parseInt(sc.next());
            switch (choice){ 
                case 0: break; //ends the program
                case 1: addObject(); break; //starting static method to add an object with a name and an id

                //here are some more cases with similar static methods (left them out for simplicity)

                default: System.out.println("Not a valid choice!");break;
            }
        }
        catch(NumberFormatException nfe){
            System.out.println("Not a valid choice!");
            choice = -1; //to keep the loop running, and prevent another exception
        }

    }while (choice != 0);

System.out.println("Good bye!");

}

私のオブジェクトクラス

public class Object{

    private int id;
    private String name;

    public Object(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

私の ObjectList クラス

import java.util.*;

public class ObjectList {

    private List<Object> objects;

    public ObjectList() {
        objects = new ArrayList<Object>();
    }

    public void addObject(Object o){
        objects.add(d);
    }
}

オブジェクトを追加するために静的メソッドを実行しようとすると、オブジェクトの ID は正常に記録されますが、オブジェクト ID を入力すると、メイン メソッドに戻り、最初からループが開始されます。スイッチに文字列を入力すると(ループを再開すると)、うまく反応します。しかし、オブジェクトを適切に追加できないようです。

これは学校の課題でもあり、(try-catch メソッドを除く) すべてのコードを渡され、静的メソッドとメイン メソッドの try-catch を書くように求められました。メインメソッドの回避策は if 句で見つかると思いますが、try-catch メソッドでこれが可能かどうか疑問に思っていました。

4

1 に答える 1

1

問題:

  • nextLine()Scanner を使用する場合、特にこのトークンを処理するメソッド呼び出し (たとえば) と処理しないメソッド呼び出し (たとえば) を組み合わせる場合は、行末トークンを処理する方法と処理しない方法に注意する必要がありますnextInt()。前者nextLine()は行末 (EOL) トークンを飲み込みますがnextInt()、同様のメソッドは飲み込まないことに注意してください。そのため、呼び出しnextInt()て行末トークンを絡ませたままにしておくと、呼び出しnextLine()は次の行を取得せず、ぶら下がっている EOL トークンを飲み込みます。1 つの解決策は、EOL トークンを処理するためだけに呼び出したsc.nextLine()直後に呼び出すことです。sc.nextInt()または、 を呼び出す場所で、それをsc.next()に変更しsc.nextLine()ます。
  • 再帰 (addObject() メソッド自体を呼び出す) を使用しないでください。単純な while ループがより適切に機能し、よりクリーンで安全な場所で実行しているためです。
  • 本当に「Object」という名前のクラスがある場合は、その名前がす​​べての Java クラスの主要な基本クラスと競合するため、変更してください。

たとえば、次のコードがあるとします。

Scanner sc = new Scanner(System.in);
System.out.print("Enter a number: ");
int number = sc.nextInt();
System.out.print("Enter name: ");
String name = sc.nextLine();

名前が常に であることがわかります。これは、ユーザーが番号を入力したときに残った行末 (EOL) トークンを が飲み込んで""いるためです。sc.nextLine()これを解決する 1 つの方法は次のとおりです。

Scanner sc = new Scanner(System.in);
System.out.print("Enter a number: ");
int number = sc.nextInt();
sc.nextLine();  // ***** to swallow the dangling EOL token
System.out.print("Enter name: ");
String name = sc.nextLine();
于 2013-08-20T22:07:55.207 に答える