Нет такого исключения элемента? - PullRequest
12 голосов
/ 07 ноября 2011

Итак, вот мой код:

public static void getArmor(String treasure)
    throws FileNotFoundException{
    Random rand=new Random();
    Scanner file=new Scanner(new File ("armor.txt"));
    while(!file.next().equals(treasure)){
        file.next(); //stack trace error here
        }
    int min=file.nextInt();
    int max=file.nextInt();
    int defense=min + (int)(Math.random() * ((max - min) + 1));
    treasure=treasure.replace("_", " ");
    System.out.println(treasure);
    System.out.println("Defense: "+defense);
    System.out.println("=====");
    System.out.println();
    }

public static void getTreasureClass(Monster monGet)
throws FileNotFoundException{
    Random rand = new Random();
    String tc=monGet.getTreasureClass();
    while (tc.startsWith("tc:")){
        Scanner scan=new Scanner(new File ("TreasureClassEx.txt"));
        String eachLine=scan.nextLine();
        while(!tc.equals(scan.next())){
        eachLine=scan.nextLine();
        }
        for (int i=0;i<=rand.nextInt(3);i++){
            tc=scan.next();
        }
    getArmor(tc); //stack trace error here
    }
 }

По какой-то причине я получаю исключение "Нет такого элемента"

    at java.util.Scanner.throwFor(Scanner.java:907)
at java.util.Scanner.next(Scanner.java:1416)
at LootGenerator.getArmor(LootGenerator.java:43)
at LootGenerator.getTreasureClass(LootGenerator.java:68)
at LootGenerator.getMonster(LootGenerator.java:127)
at LootGenerator.theGame(LootGenerator.java:19)
at LootGenerator.main(LootGenerator.java:11)

Хотя я не уверен, почему.В основном моя программа ищет два текстовых файла - armor.txt и TreasureClassEx.txt.getTreasureClass получает класс сокровищ от монстра и просматривает текст, пока не достигнет элемента базовой брони (строки, которая не начинается с tc:). Затем он ищет в getArmor броню, которая соответствует имени базовой брони, в которой он получилкласс сокровищ.Любой совет будет принят во внимание!Спасибо!

Ссылка на текстовые файлы здесь: http://www.cis.upenn.edu/~cis110/hw/hw06/large_data.zip

Ответы [ 4 ]

15 голосов
/ 07 ноября 2011

Похоже, что вы звоните по следующему, даже если у сканера больше нет следующего элемента для предоставления ... выдает исключение.

while(!file.next().equals(treasure)){
        file.next();
        }

Должно быть что-то вроде

boolean foundTreasure = false;

while(file.hasNext()){
     if(file.next().equals(treasure)){
          foundTreasure = true;
          break; // found treasure, if you need to use it, assign to variable beforehand
     }
}
    // out here, either we never found treasure at all, or the last element we looked as was treasure... act accordingly
0 голосов
/ 14 июля 2015

Я столкнулся с той же проблемой, когда имел дело с большим набором данных.Одна вещь, которую я заметил, это то, что NoSuchElementException выбрасывается, когда сканер достигает endOfFile, где это не повлияет на наши данные.

Здесь я поместил свой код в try block, а catch block обрабатывает exception.Вы также можете оставить его пустым, если не хотите выполнять какие-либо задачи.

Для приведенного выше вопроса, поскольку вы используете file.next() как в условии, так и в цикле while, вы можете обработать исключение как

while(!file.next().equals(treasure)){
    try{
        file.next(); //stack trace error here
       }catch(NoSuchElementException e) {  }
}

. Для меня это сработало идеальноЕсть какие-то угловые случаи для моего подхода, дайте мне знать через комментарии.

0 голосов
/ 21 мая 2015

Я знаю, что этот вопрос задавался 3 года назад, но у меня была та же самая проблема, и что она решила вместо того, чтобы поставить:

 while (i.hasNext()) {
    // code goes here 
}

Я сделал одну итерацию в начале, а затем проверил состояние, используя:

do {
   // code goes here
} while (i.hasNext());

Надеюсь, это поможет некоторым людям на каком-то этапе.

0 голосов
/ 07 ноября 2011

Похоже, что ваша строка file.next () в цикле while генерирует исключение NoSuchElementException, поскольку сканер достиг конца файла.Прочитайте Java (API) next () здесь

Также вам не следует вызывать next () в цикле, а также в состоянии while.В состоянии while вы должны проверить, доступен ли следующий токен, и в цикле while проверить, равен ли он сокровищу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...