2012-06-21 2 views
0

사용자가 Dungeon 및 Dragons 항목을 더 쉽게 만들 수 있도록 도와주는 응용 프로그램을 만들려고합니다.NoSuchElementException 받기

다른 무기 목록과 다른 통계 등이 있습니다. 목록 중 2 개가 프로그램에 잘 추가되었지만 그 중 1 개가 NoSuchElementException을 throw합니다. 왜 내가 그 목록과 다른 것을 발견 할 수 없기 때문에 내가 왜 다른 목록과 비교 하는지를 이해하지 못한다.

목록에서 라인은 다음과 같다 : 당신이보고 싶은데 경우 전체 목록

Light Melee Weapon,1d4,1d6,x2,10 ft.,Slashing,Axe (Throwing),8 gp, 2lb. 

http://pastebin.com/Fb2db0f1 링크가 문제를 일으키는.

http://pastebin.com/9Hg0Rw2a 잘 작동하는 목록에 대한 링크!

나는이 방법이 너무 오랫동안 보지 않기를 바랍니다. 나는 이것을 시도하고 고치기 위해 내가 생각할 수있는 모든 것을 정말로했다. 그리고 그것이 문제의 원인이되는 목록이라는 것이 긍정적입니다. 왜냐하면 내가 목적지에서 그것을 제거하자 마자 프로그램이 정상적으로 실행되기 때문입니다!

작동하는 목록에서 for 루프를 제대로 실행하지만 첫 번째 목록은 작동하지 않습니다 ._. 각 입력 라인이 9 개 항목이 있다고 가정으로이

   while(st.hasMoreTokens()) { 

        w = new Weapon(WeaponCategory.fromString(st.nextToken()), 
          st.nextToken(),st.nextToken(),st.nextToken(), 
          st.nextToken(),st.nextToken(),st.nextToken(), 
          st.nextToken(),st.nextToken()); 
        weapons.put(w.getName(), w); 
       } 

같은

Exception in thread "main" java.util.NoSuchElementException 
at java.util.StringTokenizer.nextToken(StringTokenizer.java:349) 
at MainGUI.init(MainGUI.java:60) 
at MainGUI.main(MainGUI.java:32) 

public HashMap<String,Weapon> init() { 
    String path = "base"; 
    File folder = new File(path); 
    File[] listOfFiles = folder.listFiles(); 
    if(listOfFiles.length == 0) { 
     JOptionPane.showMessageDialog(MainGUI.this, "The folder \"base\" was empty"+ 
       " so no weapons or armor was attempted loaded.", "Warning", 
       JOptionPane.WARNING_MESSAGE); 
     return new HashMap<>(); 
    } 
    HashMap<String, Weapon> weapons = new HashMap<>(); 
    BufferedReader r = null; 
    for(File f : listOfFiles) { 
     if(f.getName().endsWith(".txt")) { 
      String line; 
      try { 
       r = new BufferedReader(new FileReader(f)); 
       while((line = r.readLine()) != null) { 
        Weapon w; 
        StringTokenizer st = new StringTokenizer(line,","); 
        while(st.hasMoreTokens()) { 

         w = new Weapon(WeaponCategory.fromString(st.nextToken()), 
           st.nextToken(),st.nextToken(),st.nextToken(), 
           st.nextToken(),st.nextToken(),st.nextToken(), 
           st.nextToken(),st.nextToken()); 
         weapons.put(w.getName(), w); 
        } 
       } 
      } catch(FileNotFoundException fnfe) { 
       JOptionPane.showMessageDialog(MainGUI.this, "The File "+ 
        f.getName() + " was not found.", "Error", 
        JOptionPane.ERROR_MESSAGE); 
      } catch(IOException ioe) { 
       JOptionPane.showMessageDialog(MainGUI.this, "There was a problem reading "+ 
         f.getName() + ".", "Error", 
         JOptionPane.ERROR_MESSAGE); 
      } 
     } 
    } 
    try { 
     r.close(); 
    } catch (IOException ex) { 
     JOptionPane.showMessageDialog(MainGUI.this, "An error occured while" 
       + "closing the File Reader Stream:\n"+ex.getMessage(), 
       "Error", JOptionPane.ERROR_MESSAGE); 
    } 
    return weapons; 
} 
+1

문제를 일으키는 라인을 식별 할 수에서 System.out.println (라인)를 추가합니다. 마지막 독자뿐만 아니라 모든 독자를 닫습니다. –

+0

특정 파일에 도달하면 중지됩니다. – OmniOwl

+0

그래서 뭐? System.out에 줄을 쓰지 못하게하는 이유는 무엇입니까? –

답변

0

코드는 안전하지 않습니다. 항목 수를 확인하고 유효하지 않은 행을 정상적으로 처리해야합니다 (예 : 문제를 쉽게 식별 할 수 있도록 행의 내용을 작성하는 등).

이 간단한 방법 중 하나는 String.split()을 사용하여 회선을 토큰 화하는 것입니다. String[]을 반환하며 요소에 액세스하기 전에 크기를 쉽게 확인할 수 있습니다.

+0

그래,해야한다. 이것은 빠른 프로토 타입 이었기 때문에 나는 그다지 많은 것을하지 않았습니다. 의견을 높이 평가. – OmniOwl

+0

귀하의 답변을 수락했습니다. 그러나 실제로 그 원인이 아닙니다. 그러나 내가 당신이 제안한 것을해야한다는 점에 유의하는 것이 좋습니다. 해결책을 알고 싶다면 제 질문에 대한 의견을보십시오. – OmniOwl

+0

@Vipar, 엄밀히 말하자면, 그 근본 원인은 그 파일의 무효 한 라인이었습니다. 그러나 제대로 작성된 프로그램은 정상적으로 이러한 상황을 처리하여 입력 파일에서 오류를 찾아 수정하는 데 필요한 모든 정보가 포함 된 적절한 오류 메시지를 표시해야합니다. 그래서이 의미에서 문제의 원인은 실제로 코드의 버그였습니다. –

0

Stringtokenizer는 요즘 조금 오래된 학교입니다.

쉼표가 포함 된 항목이없는 경우 스캐너를 사용하거나 쉼표로만 구분할 수 있습니다.

String[] parts = line.split(",") 
if (parts.length != 9){ 
    throw new RuntimeException("Bad line : " + line); 
} 
... 
//continue processing 

또한 각 라인에 증가 된 카운터를 할 수 : 당신이 분할 갔다 경우 부품의 항목의 양이 요소의 오른쪽 숫자가 포함 된 경우

당신이 볼 수있는 검사를 할 수있는 그런 다음 어떤 행에서 예외가 발생하는지 표시 할 수 있습니다.

0

입력이 고갈되면 NoSuchElementException이 발생합니다. 표준 입력에서는 발생하지 않을 가능성이 있습니다 (대신 차단됩니다). 잘못된 값은 InputMismatchException을 생성합니다.

데이터 유형이 없으면 걱정하지 마십시오. 하지만 다른 데이터 타입을 원한다면 Bean 객체에 추가하기 전에 확인해야한다.

0

간단한 ...

String splitString = "Hi! Amazing! wonderful!" 
    for (String token : splitString.split("!")) { 
     System.out.println(token.toString()); 
    } 
  • 결과 :

    Hi! 
        Amazing! 
        wonderful! 
    
+0

야,이 질문은 2012 년에 게시되었습니다. – OmniOwl