2012-07-18 4 views
2

데이터 파일을 읽는 것만으로 연습을 시작합니다. 프로그램을 실행하면 데이터 파일이 읽히고 읽히지 않습니다. 그러나 어떤 이유로 든 여전히 "NoSuchElementException"이 발생하고 출력 결과가 형식화되지 않습니다. 여기에 무슨 일이 일어나고 있는지입니다 : Java : NoSuchElementException

내가 다음과 같습니다 간단한 데이터 파일 생성 : 나는 간단한 "게터"와 "세터"프로그램을 쓴 후

Barry Burd 
Author 
5000.00 
Harriet Ritter 
Captain 
7000.00 
Ryan Christman 
CEO 
10000.00 

을 (코드는 다음과 같습니다).

import static java.lang.System.out; 

    //This class defines what it means to be an employee 

public class Employee { 

    private String name; 
    private String jobTitle; 

    public void setName(String nameIn) { 
    name = nameIn; 
    } 

    public String getName() { 
    return name; 
    } 

    public void setJobTitle(String jobTitleIn) { 
    jobTitle = jobTitleIn; 
    } 

    public String getJobTitle() { 
    return jobTitle; 
    } 

    /*The following method provides the method for writing a paycheck*/ 

    public void cutCheck(double amountPaid) { 
    out.printf("Pay to the order of %s ", name); 
    out.printf("(%s) ***$", jobTitle); 
    out.printf("%,.2f\n", amountPaid); 
    } 

} 

쉽습니다. 그 다음 나는이 물건을 실제로 사용하는 프로그램을 썼다 (아래 코드).

Pay to the order of Exception in thread "main" java.util.NoSuchElementException: No line found 
    at java.util.Scanner.nextLine(Scanner.java:1516) 
    at DoPayroll.payOneEmployee(DoPayroll.java:25) 
    at DoPayroll.main(DoPayroll.java:14) 
Barry Burd (Author) ***$5,000.00 
Pay to the order of Harriet Ritter (Captain) ***$7,000.00 
Pay to the order of Ryan Christman (CEO) ***$10,000.00 

편집 내가 문제를 발견하지만 난 롤을 이해하지 않습니다

import java.util.Scanner; 
import java.io.File; 
import java.io.IOException; 

public class DoPayroll { 

    public static void main(String[] args) throws IOException { 
    Scanner diskScanner = new Scanner(new File("EmployeeInfo.txt")); 

    for (int empNum = 1; empNum <= 3; empNum++) { 
     payOneEmployee(diskScanner); 
    } 
    } 

    static void payOneEmployee(Scanner aScanner) { 
    Employee anEmployee = new Employee(); 

    anEmployee.setName(aScanner.nextLine()); 
    anEmployee.setJobTitle(aScanner.nextLine()); 
    anEmployee.cutCheck(aScanner.nextDouble()); 
    aScanner.nextLine(); 
    } 
} 

여기 내 출력됩니다. 분명히, 나는 데이터 파일의 끝에 빈 줄을 추가해야했다 .... 왜?

답변

2

문제가 발견되었지만 이해할 수 없습니다. 분명히, 나는 데이터 파일의 끝에 빈 줄을 추가해야했다 .... 왜?

당신은 입력 파일의 급여 후에 캐리지 리턴이 될 것입니다 Scanner 것을 말하고있다 때문입니다. 그러나 마지막 항목에서는 캐리지 리턴이 없었으므로 프로그래밍 오류가 발생하여 확인되지 않은 예외가 발생했다고 판단되었습니다.

당신과 같이 코드에서 문제를 해결할 수 :

static void payOneEmployee(Scanner aScanner) { 
    Employee anEmployee = new Employee(); 

    anEmployee.setName(aScanner.nextLine()); 
    anEmployee.setJobTitle(aScanner.nextLine()); 
    anEmployee.cutCheck(aScanner.nextDouble()); 
    if (aScanner.hasNextLine()) { 
     aScanner.nextLine(); 
    } 
} 
1

나는 그것이 파일의 끝에 도달했다고 생각한다. while 루프를 추가해야합니다.

while(aScanner.hasNext()) { 
    ... 
} 

이렇게하면 스캐너가 파일 끝을 지나칠 수 없습니다.

+0

이 실제로 오해의 소지 솔루션입니다 ...

aScanner.nextLine(); 

...로 변경할 수 있습니다. 'hasNext()'는 Scanner가 읽을 수있는 공백이 아닌 문자가있는 한 true를 반환합니다. 이것은 캐리지 리턴으로 끝날 수도 있고 끝나지 않을 수도 있습니다. 그렇지 않으면 코드는 여전히 'while'루프를 입력하고 Exception은 여전히 ​​throw됩니다. – asteri

0

여기에서 파일은 '0'문자로 끝나고 aScanner.nextLine()은 줄 바꿈 문자 ('\ n')를 사용하려고했습니다.

여기 흥미로운 점은 예외가 발생한 부분입니다. 그것은 첫 번째 cutCheck() 인쇄의 중간에있는 것 같습니다. 내 생각 엔 여기에는 출력 스트림의 IO 버퍼링과 비동기 성이 관련되어있다. out.printf()은 stdout이고, 오류 메시지가 stderr에 나오므로 이상한 동작을 설명 할 수 있습니다.

for 루프에 넣으면 인쇄 문제를 해결할 수 있습니다.

+0

오류가 출력 중간에 있었음이 분명합니다. –

+0

Thread.sleep() 확인을 추가하십시오. 나는 전에 그런 종류의 것을 보았고, 디버깅 결과를 파싱하는 것을 혼란스럽게 만들 수 있다고 생각한다. – mfrankli

0

당신은 aScanner.nextLine를 호출하기 전에 hasNextLine()를 호출해야. 파일 끝에없는 행을 읽으려고합니다.

2

payOneEmployee()으로 전화 할 때마다 aScanner.nextLine()으로 전화하십시오.마지막으로 호출 할 때 (for 루프에서 empNum이 3과 같음). 파일에 더 이상 새로운 줄 (\n)이없고 여전히 nextLine()을 호출하면 NoSuchElementException이 수신되었으므로 ... 음 ... 그런 요소가 없었기 때문입니다. 이는 파일의 마지막 요소가 0 문자이기 때문입니다.

앞으로는이를 피하기 위해 간단한 체커를 추가 할 수 있습니다. java.util.Scanner에는 이미 hasNextLine()이 구현되어 있습니다. 따라서, 당신은 단순히

if(aScanner.hasNextLine()) aScanner.nextLine();