java scanner 오류

24.04.07 20:44 작성 24.04.07 20:53 수정 조회수 54

0

txt파일에는 아래와 같이 저장되어 있습니다. 점수가 가장 높은 학생의 이름을 출력해야하고 점수가 동일할 경우 모두 출력하는 프로그램입니다.

김일번 64

김이번 83

김삼번 26

김사번 36

김오번 78

김육번 54

김칠번 60

김팔번 85

김구번 45

김십번 85

프로그램을 실행했을 때

Exception in thread "main" java.util.InputMismatchException

at java.base/java.util.Scanner.throwFor(Scanner.java:947)

at java.base/java.util.Scanner.next(Scanner.java:1602)

at java.base/java.util.Scanner.nextInt(Scanner.java:2267)

at java.base/java.util.Scanner.nextInt(Scanner.java:2221)

이렇게 오류가 발생합니다. 해결방법 아시는 분 가르쳐주세요!!ㅜㅜ

package kh;

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

class Student
{
	//int id;
	String name;
	int grade;
	Student(String name, int grade)
	{
		//this.id=id; 
		this.name=name; 
		this.grade=grade;
	}
}
class StudentTable{
	Student[] st;
	StudentTable(int size)
	{
		st=new Student[size];	
	}
	void maxStudent()
	{
		int maxGrade=0;
		for(Student student : st) 
		{
			if(student.grade > maxGrade) 
			{
				maxGrade = student.grade;
			}
		}
		 System.out.println("최고 점수를 가진 학생:");
		 for(Student student : st) 
		 {
			 if(student.grade == maxGrade)
			 {
				 System.out.println(" " + student.name + " " + student.grade);
			 }
		 }
	}
}
public class homework05{
	public static void main(String[] args) {
		StudentTable stable;
		try {
			FileInputStream fin=new FileInputStream("C:\\Users\\user\\Desktop\\student_score.txt");
			Scanner scanner = new Scanner(fin);
			int size=scanner.nextInt();
			
			stable=new StudentTable(size);
			
			for(int i=0; i<stable.st.length; i++)
			{
				//int id=scanner.nextInt();
				String name=scanner.next();
				int grade=scanner.nextInt();
				
				stable.st[i]=new Student(name,grade);
				
				
				System.out.println(" "+name+" "+grade);
			}
			scanner.close();
			stable.maxStudent();
		}
		catch(FileNotFoundException e) 
		{
			System.out.println("file not exist");
		}
	}
}

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.08

안녕하세요, 인프런 AI 인턴입니다.

dkfma0799님, 제시하신 코드와 오류 메시지를 보면 java.util.InputMismatchException 예외는 Scanner가 예상과 다른 타입의 데이터를 만났을 때 발생합니다. 코드 상에서 Scanner는 파일의 첫 줄에서 정수를 읽으려고 시도합니다(int size=scanner.nextInt();). 그러나 txt파일의 내용을 보면 파일의 시작이 정수가 아닌 문자열(이름)로 시작합니다. 이것이 예외의 원인입니다.

txt 파일의 첫 줄에 학생의 총 수를 읽으려고 하지만, 실제 파일에는 이름과 점수가 차례로 나열되어 있습니다. 프로그램이 파일의 첫 번째 문자열(이름)을 정수로 해석하려고 시도할 때 InputMismatchException이 발생합니다.

이 문제를 해결하기 위한 한 가지 방법은 파일에서 직접 학생의 수를 읽는 대신, 학생의 목록을 읽어내는 동안 동적으로 ArrayList와 같은 가변 크기 컬렉션을 사용하는 것입니다. 이렇게 하면 미리 학생의 수를 알 필요가 없어집니다.

아래는 수정된 코드의 일부입니다. 가변 크기의 ArrayList를 사용하여 학생들을 저장하고 관리하는 방법을 보여줍니다:

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

class StudentTable{
	ArrayList<Student> st = new ArrayList<>();

	void maxStudent() {
		int maxGrade = 0;
		for(Student student : st) {
			if(student.grade > maxGrade) {
				maxGrade = student.grade;
			}
		}
		System.out.println("최고 점수를 가진 학생:");
		for(Student student : st) {
			if(student.grade == maxGrade) {
				System.out.println(" " + student.name + " " + student.grade);
			}
		}
	}
}

public class homework05 {
	public static void main(String[] args) {
		StudentTable stable = new StudentTable();
		try {
			FileInputStream fin = new FileInputStream("C:\\Users\\user\\Desktop\\student_score.txt");
			Scanner scanner = new Scanner(fin);

			while (scanner.hasNext()) {
				String name = scanner.next();
				int grade = scanner.nextInt();
				stable.st.add(new Student(name, grade));
			}
			scanner.close();
			stable.maxStudent();
		} catch (FileNotFoundException e) {
			System.out.println("file not exist");
		}
	}
}

이 방법을 사용하면 파일의 첫 줄에 학생 수를 명시할 필요가 없으며, 파일을 끝까지 읽으면서 학생 정보를 동적으로 ArrayList에 추가할 수 있습니다.