2012-08-07 4 views
2

의 주요 문제이다. 그것은 바로 아래쪽에있는 (answer.charAt (i) == char)로 5 개의 jother 오류와 함께 java.util.NoSuchElementException을 얻고 있다는 것입니다.예외 : NoSuchElementException 읽기/스캔 입력

import java.io.*; 
import java.util.Scanner; 

class ExamAnalysis 
{ 
    public static void main(String [] args) throws FileNotFoundException 
    { 
     Scanner keyboard = new Scanner(System.in); 
     System.out.println("Please type the correct answers to the exam questions, one right after the other: "); 
     String answers = keyboard.nextLine(); 
     System.out.println("Where is the file with all the student responses? "); 
     String responses = keyboard.nextLine(); 
     Scanner read = new Scanner(new File(responses)); 


     while (read.hasNextLine()) 
     { 
     for (int i = 0; i <= 10; i++) 
     { 
      responses = read.nextLine(); 
      int p = 1; 
      p += i; 
      System.out.println("Student " + p + " responses: " + responses.substring(0,10)); 
      } 
      System.out.println("Thank you for the data on 9 students. Here's the analysis: "); 
      resultsByStudents(responses, answers); 
      analysis(responses); 
      } 
     } 

     public static void resultsByStudents(String responses, String answers) 
      { 
      System.out.println ("Student #  Correct  Incorrect  Blank"); 
      System.out.println ("~~~~~~~~~  ~~~~~~~  ~~~~~~~~~  ~~~~~"); 
      int student = 0; 
      int correct = 0; 
      int incorrect = 0; 
      int blank = 0; 

     for (int i = 0; i <= 9; i++) 
     { 
      for (int j = 0; j <= responses.length(); j++) 
      { 
      if ((responses.charAt(j)) == answers.charAt(j)) 
      correct++; 
      else if ((responses.charAt(j)) != answers.charAt(j)) 
      incorrect++; 
      else 
      blank++; 
      } 
      System.out.println(student + "  " + correct + "  " + incorrect + "  " + blank); 
      student++; 
     }  
     } 

    public static void analysis(String responses) 
    { 
     System.out.println("QUESTION ANALYSIS (* marks the correct response)"); 
     System.out.println("~~~~~~~~~~~~~~~~~"); 


    //stores the percentage of each choice chosen 
    double A = 0; 
    double B = 0; 
    double C = 0; 
    double D = 0; 
    double E = 0; 
    double X = 0; 
    // tallys every variable chosen per question 

    for (int i = 0; i <= 10; i++) // go through all the questions 
    { 
    for (int j = 0; j <= responses.charAt(i); j++) //go through all the student responses 
    { 
     // variable that are being tallied 
     int chooseA = 0; 
     int chooseB = 0; 
     int chooseC = 0; 
     int chooseD = 0; 
     int chooseE = 0; 
     int chooseBlank = 0; 
    //variables take percentage of choices that have been chosen from each student 
     A = chooseA/9; 
     B = chooseB/9; 
     C = chooseC/9; 
     D = chooseD/9; 
     E = chooseE/9; 
     X = chooseBlank/9; 
     // variables that will print the asterisk with certain character of correct answer 
     String a = "A"; 
     String b = "B"; 
     String c = "C"; 
     String d = "D"; 
     String e = "E"; 
     String blank = "blank"; 


     if (responses.charAt(j) == A) 
     chooseA++; 
     else if (responses.charAt(j) == B) 
     chooseB++; 
     else if (responses.charAt(j) == C) 
     chooseC++; 
     else if (responses.charAt(j) == D) 
     chooseD++; 
     else if (responses.charAt(j) == E) 
     chooseE++; 
     else 
     chooseBlank++; 


    System.out.println("Question #" + i); 
     if (answers.charAt(i) == 'A') a = "A*"; // answers cannot be resolved(I already made it a global variable in my main method.) 
     else if (answers.charAt(i) == 'B') b = "B*";// answers cannot be resolved 
     else if (answers.charAt(i) == 'C') c = "C*";// answers cannot be resolved 
     else if (answers.charAt(i) == 'D') d = "D*";// answers cannot be resolved 
     else if (answers.charAt(i) == 'E') e = "E*";// answers cannot be resolved 
     System.out.println(a + "  " + b + "  " + c + "  " + d + "  " + e + "  " + blank); 
    System.out.println (chooseA + "  " + chooseB + "  " + chooseC + "  " + chooseD + "  " + chooseE + "  " + chooseBlank); 
    System.out.println (A + "  " + B + "  " + C + "  " + D + "  " + E + "  " + X); 
    } 
} 

} }

답변

0

루프에 대한 문제를 해결할 수 있습니다 제거 : 여기 내 프로그램입니다. while(hasNextLine())을 사용하여 한 번만 확인하지만 for 루프에서는 read.nextLine()을 10 번 호출합니다. 여기

for (int i = 0; i <= 10; i++) 
     { 
      responses = read.nextLine(); 
     ....... 
      } 
2
while (read.hasNextLine())   
{   
    for (int i = 0; i <= 10; i++)   
    {  
     responses = read.nextLine(); 
     int p = 1;   
     p += i;   
     System.out.println("Student " + p + " responses: " + responses.substring(0,10));    
    }    
    System.out.println("Thank you for the data on 9 students. Here's the analysis: ");    
    resultsByStudents(responses, answers);    
    analysis(responses);    
    }   
} 

귀하의 논리를 혼동한다. read.nextLine(); "이 스캐너는 현재 줄을 넘어서서 건너 뛴 입력을 반환합니다.이 메서드는 끝에있는 줄 구분자를 제외한 나머지 줄을 반환합니다. 위치는 다음 줄의 시작 부분으로 설정됩니다."

말하자면, 줄이 있습니까? 그렇다면 다음 10 개의 ... 음 ... 11 개의 행을 읽으십시오. 이는 원하는 것이 아닙니다. 이 시점 이후 11 줄이 있는지 당신은 모른다. 차종 :

+0

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html#nextLine() –

+0

내 입력 파일에있는 내용을 읽어야하는 스캐너가 있습니까? –

+0

첫 번째 부분은 학생을 1 씩 증가시키고 각 학생에게 입력 파일의 응답을 할당하는 것입니다. 각 학생은 10 개의 다른 대답이있는 입력 파일에서 한 줄을 가져옵니다. –

0
int i = 0; 
int numberOfStudents = 9; 
while (i < numberOfStudents && read.hasNextLine()){ 
    responses = read.nextLine(); 
    i++; 
    System.out.println("Student " + i + " responses: " + responses.substring(0,10)); 
} 
System.out.println("Thank you for the data on "+ numberOfStudents +" students. Here's the  analysis: "); 
resultsByStudents(responses, answers); 
analysis(responses); 

내가 < numberOfStudents "11 개 라인을 읽기"텍스트 파일이 생겼는지 모르겠지만, "그것은 다음 라인을 가지고 있지만"당신은이 부분을 재구성 중 하나 말하고 싶은 것, 또는 필요한 삽입 횟수

read.hasNextLine() : 콘솔에서 입력이 있는지 확인합니다. 그렇지 않으면 프로그램은 입력을 대기합니다.

for (int i = 0; i <= 10; i++) 

카운트 0 -> 10 = 11 학생

관련 문제