2011-11-07 14 views
7

Więc tutaj jest mój kod:Nie ma wyjątku takiego elementu?

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 
    } 
} 

Z jakiegoś powodu otrzymuję Brak takiego elementu wyjątek

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) 

Nie jestem pewien, dlaczego mimo. Zasadniczo mój program przeszukuje dwa pliki tekstowe - armor.txt i TreasureClassEx.txt. getTreasureClass odbiera potwora od potwora i przeszukuje txt, aż dotrze do podstawowego przedmiotu pancerza (ciąg, który nie zaczyna się od tc :.) Następnie wyszukuje getArmor na zbroję, która pasuje do nazwy podstawowego pancerza, który dostał klasa skarbu. Każda rada byłaby doceniona! Dzięki!

Łącze do plików txt jest tutaj: http://www.cis.upenn.edu/~cis110/hw/hw06/large_data.zip

+0

Byłoby miło, gdyby można było oznaczyć linie kodu wspomniane w stosie za pomocą komentarzy, abyśmy mogli uzyskać punkt odniesienia. –

+0

Czy możesz opublikować zawartość pliku? – Tom

Odpowiedz

12

Wygląda dzwonisz obok nawet jeśli skaner nie ma już następnego elementu, aby zapewnić ... rzuca wyjątek.

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

powinno być coś jak

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

Wypróbowałem twój kod, ale nie otrzymałem takiego wyjątku dla mojego min/max nextInt(), co jest dziwne, ponieważ czy pętla nie zrywa się, gdy jest równa skarbowi?Czy po tym nie powinno być jeszcze następnej int? W ten sposób połączyłem pliki txt w moim głównym wpisie, odpowiedni jest plik armor.txt i TreasureClassEx.txt. Dzięki! – Akaraka

+0

Poprawiłem moją odpowiedź, aby było trochę bardziej zrozumiałe. Może się zdarzyć, że w ogóle nie znajdziesz skarbu ... więc twoje wezwania do NextInt zawiodą, ponieważ nie ma już żadnych żetonów do przeczytania. Chciałbym przetestować coś podobnego do powyższego kodu i dodać debugowanie, aby sprawdzić, czy file.next(). Equals (skarb) jest zawsze oceniany jako prawdziwy. – Bryan

0

wygląda jak file.next() linia w pętli while rzuca NoSuchElementException ponieważ skaner osiągnie koniec pliku. Przeczytaj następny() java API here

Również nie powinieneś wywoływać next() w pętli, a także w warunku while. W warunku while należy sprawdzić, czy dostępny jest następny token, a wewnątrz pętli while sprawdzić, czy jest równy skarbowi.

0

Wiem, że to pytanie zostało aked 3 lata temu, ale po prostu miałem ten sam problem, a co rozwiązane było zamiast umieszczać:

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

zrobiłem jednej iteracji na początku, a następnie sprawdzane pod kątem condition using:

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

Mam nadzieję, że pomoże to niektórym osobom na pewnym etapie.

0

Znalazłem ten sam problem, gdy miałem do czynienia z dużym zbiorem danych. Zauważyłem jedną rzecz: NoSuchElementException jest generowany, gdy skaner dociera do endOfFile, gdzie nie ma to wpływu na nasze dane.

Tutaj umieściłem mój kod w try block i catch block obsługuje exception. Możesz również pozostawić go pustym, jeśli nie chcesz wykonywać żadnych zadań.

Na powyższe pytanie, ponieważ używasz file.next() zarówno w warunkach i w pętli while można obsłużyć wyjątek jako

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

To działało idealnie dla mnie, czy istnieją przypadki narożne dla mojego podejście, daj mi znać poprzez komentarze.

+1

[puste bloki catch są generalnie złym pomysłem] (https://stackoverflow.com/questions/1234343/why-are-empty-catch-blocks-a-bad-idea) –

Powiązane problemy