静态方法在Try-Catch中没有完全执行

时间:2013-08-20 21:56:14

标签: java exception static-methods

我将静态方法添加到对象的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);
    }
}

当我尝试运行静态方法来添加一个Object时,它会很好地记录对象的id,但是当我输入对象id时,它会返回到我的main方法,从头开始循环。 当我在交换机中输入一个字符串(重新启动循环)时,它会做出反应。 但我似乎无法正确添加对象。

这也是一个学校作业,他们给了我们所有这些代码(try-catch方法除外),并要求我们为静态方法和main方法编写try-catch。 我可能会找到一个使用if子句的main方法的解决方法,但我想知道这是否可以使用try-catch方法。

1 个答案:

答案 0 :(得分:1)

的问题:

  • 使用扫描程序时,您必须知道它是如何操作的,并且不会处理行结束标记,尤其是当您组合处理此标记的方法调用(例如nextLine())和那些't(例如nextInt())。请注意,前者nextLine()吞下行尾(EOL)令牌而nextInt()和类似方法不会。因此,如果您拨打nextInt()并留下行尾令牌纠结,则调用nextLine()将无法获得您的下一行,而是会吞下悬空的EOL令牌。一种解决方案是在调用sc.nextLine()之后立即调用sc.nextInt()来处理EOL令牌。或者,在您致电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();

您会发现该名称始终为"",这是因为sc.nextLine()吞下了用户输入数字后留下的行尾(EOL)令牌。解决此问题的一种方法是:

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();