继续收到错误消息“线程中的异常”主“java.util.NoSuchElementException”

时间:2010-11-28 18:54:34

标签: java

这是我的代码

public class NEW {
    String Firstname;
    String Lastname;
    String Position;
    int Jnum;
    String Team;

    public static void main(String[] args)   throws Exception {

        String a =  JOptionPane.showInputDialog("Enter in 0 to sort by First Name\nEnter in 1 to sort by Last Name\n" +

                "Enter in 2 to sort by position\nEnter in 4 to sort by Team names");

        int q = Integer.parseInt(a);    
        File input  = new File("Roster.txt");
        Scanner players = new Scanner(input);
        NEW []  array = new NEW [435];
        int x=0;
        while (players.hasNext()){
            array[x] = new NEW();
            array[x].Firstname  = players.next();
            array[x].Lastname  = players.next();
            array[x].Position  = players.next();
            array[x].Jnum  = players.nextInt();
            array[x].Team  = players.next();
        }
       JOptionPane.showMessageDialog(null, array.toString()," ", JOptionPane.INFORMATION_MESSAGE);

    players.close();
    }

    public static NEW[] BubbleSort(int num, NEW []array){
       int p=0;

       if (num==0){
       String temp = null;
           for(int k =1;k<435;k++){
        for(int i=0;i<435-k;i++){
            if(array[i].Firstname.compareTo(array[i+1].Firstname)>0){
              temp = array[i].Firstname;
            array[i].Firstname=array[i+1].Firstname;
            array[i+1].Firstname= temp;
            }
            p++;
        }
    }


return array;
    }


    if (num==1){
        String temp = null;
        for(int k =1;k<435;k++){
        for(int i=0;i<435-k;i++){
            if(array[i].Lastname.compareTo(array[i+1].Lastname)>0){
              temp = array[i].Lastname;
            array[i].Lastname=array[i+1].Lastname;
            array[i+1].Lastname= temp;
            }
            p++;
    }

}
return array;
}


       if (num ==2){
           String temp = null;
           for(int k =1;k<435;k++){
        for(int i=0;i<435-k;i++){
            if(array[i].Position.compareTo(array[i+1].Position)>0){
              temp = array[i].Position;
            array[i].Position=array[i+1].Position;
            array[i+1].Position= temp;
            }
            p++;
       }


           }

       return array;
       }


       if (num ==3){
           int temp = 0;
           for(int k =1;k<435;k++){
        for(int i=0;i<435-k;i++){
            if(array[i].Jnum>(array[i+1].Jnum))
              temp = array[i].Jnum;
            array[i].Jnum=array[i+1].Jnum;
            array[i+1].Jnum= temp;
            p++;
       }


           }

       return array;
       }


       if (num ==4){
           String temp = null;
           for(int k =1;k<435;k++){
        for(int i=0;i<435-k;i++){
            if(array[i].Team.compareTo(array[i+1].Team)>0){
              temp = array[i].Team;
            array[i].Team=array[i+1].Team;
            array[i+1].Team= temp;
            }
            p++;
       }


           }

       return array;
       }

       else return array;





    }
}

4 个答案:

答案 0 :(得分:2)

在堆栈跟踪中,将有源文件的名称行号。这些将告诉您确切的问题源代码行,这最终是您尝试访问没有的集合元素。例如:

List<String> l = Collections.emptyList();
String s = l.get(0); //will throw NoSuchElementException

或者它也可能表示您正在迭代Iterator结束(请注意Scanner implements Iterator<String>):

Iterator<String> itr = Collections.singleton("Hey").iterator();
itr.next(); // ok!
itr.next(); //will throw NoSuchElementException

每次在next()上拨打Iterator时,“指针”都会向前移动。如果您需要多次访问下一个元素,则需要将其保存在局部变量中,并且总是使用hasNext()来检查元素是否可用:

while (itr.hasNext()) {
    String s = itr.next();
    System.out.println("Length of \"" + s + "\" is: " + s.length()); //access twice
}

除非您使用的是itr.remove(),否则您可以利用 java foreach 循环,这样就无需编写大量的样板文件上面,虽然这不适用于ScannerIterator的情况 - foreach仅适用于Iterable的实例:

for (String s : someIterable) {
  //can use s as many times as you want
}

答案 1 :(得分:0)

正如oxbow_lakes所提到的,关于异常的更多信息会很好。

但是这段代码很可疑:

while (players.hasNext()){

    array[x] = new NEW();
    array[x].Firstname  = players.next();

    array[x].Lastname  = players.next();

    array[x].Position  = players.next();

    array[x].Jnum  = players.nextInt();
    array[x].Team  = players.next();
}

如果players在循环顶部可用的令牌少于五个,则其中一个next将失败。 hasNext告诉您的是,至少有一个令牌可用。你在这里假设至少有一个意味着你拥有全部五个,这显然不是一个有效的假设,因为当你没有可用的令牌时,你会得到next被记录为抛出的确切异常。

答案 2 :(得分:0)

你已经使用了hasNext()方法,它实际上是一个枚举器()将你的数组更改为一个列表......它会更容易..你也用过next()

将其更改为List newelement = new LinkedList();

然后其他代码..

答案 3 :(得分:0)

先生,并不是说他在文件中的数量超过435 ..它的价格低于435 ..

这就是为什么它返回null ...

他使用了next()

将其列入清单......

至少它会等于你输入的内容..它不会是435但它等于文件的长度......

如此链接所述

http://download.oracle.com/javase/1.4.2/docs/api/java/util/NoSuchElementException.html