java scanner 오류
272
작성한 질문수 1
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 인턴입니다.
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에 추가할 수 있습니다.
29강 5:00
0
16
2
3차원 배열의 인덱스 해석 순서와 3중 반복문 순회 메커니즘에 대해 질문드립니다.
0
18
1
인텔리제이 설정 최신화 관련 확인 부탁 드립니다!
0
28
2
띄어쓰기
0
31
2
공부 순서
1
37
2
코딩 문제 사이트 접속 오류
0
26
1
재귀함수 연산법
0
30
2
동일성 동등성
0
20
1
안녕하세요 치킨 디도스 이벤트 보고 흉내내보려 들어왔습니다..
0
26
2
47번 리턴 관련 질문
0
27
1
실무 내용 문의드려요
0
28
2
IO활용-회원관리예제1 샘플코드 문의
0
21
1
join에대해 질문드립니다.
0
22
1
pg사가 있다고 가정하면
0
26
1
중급 1편 학습 방향에 대해 조언 부탁드립니다
0
42
1
To-Do App
0
27
1
강의노트 접속 불가
0
29
2
Kafka Cluster 구성도 질문
0
24
1
26년 1회차 기출 강의
0
62
2
기출문제
0
60
1
정보처리기사 실기 zip
0
48
2
답을언제쯤받아볼수있나요
0
58
2
데이터베이스 노션
0
40
2
형 책 어떻게 받아?
1
61
1





