Нет такого исключения элемента для моей функции babyname
Это мой код:
import java.awt.*;
import java.util.*;
import java.io.*;
public class BabyNames
{
public static int decades = 11;
public static void main (String [] args) throws FileNotFoundException
{
DrawingPanel panel = new DrawingPanel(550,560);
Graphics g = panel.getGraphics();
panel.setBackground(Color.WHITE);
String line = search();
graph(g,line);
}
public static String search() throws FileNotFoundException
{
Scanner util = new Scanner(new File("names.txt"));
String line = "";
String requestedName = name();
String rankings = "";
String rank = "";
while (util.hasNextLine())
{
line = util.nextLine();
Scanner tracer = new Scanner(line);
String name = tracer.next();
if (name.equalsIgnoreCase(requestedName))
{
for (int x =1;x<=decades;x++)
{
rank = tracer.next();
rankings+=rank+" ";
}
}
if (!util.hasNextLine())
{
System.out.print("no data");
break;
}
}
return rankings;
}
public static String name()
{
String requestName = "";
Scanner console = new Scanner(System.in);
System.out.println("Type a name: ");
requestName = console.next();
return requestName;
}
public static void graph(Graphics g,String rankings)
{
g.setColor(Color.YELLOW);
g.fillRect(0,0,550,30);
g.fillRect(0,530,550,30);
g.setColor(Color.LIGHT_GRAY);
for (int x = 0; x <= 11;x++)
{
g.drawLine(0+50*x,30,0+50*x,530);
}
for (int x = 0;x<=10;x++)
{
g.drawLine(0,30+50*x,550,30+50*x);
}
Scanner console = new Scanner(rankings);
g.setColor(Color.RED);
int position = 0;
int firstRank = console.nextInt();
int position2 = firstRank/2+30;
for (int x = 0; x<=decades-1;x++)
{
int rank = console.nextInt();
if (rank==0)
{
position=530;
}
else
{
position = rank/2+30;
}
g.drawLine(0+x*50-50,position2,0+x*50,position);
position2 = position;
}
}
}
Код запрашивает имя, затем ищет это имя в файле и затем отображает рейтинг в другом окне.
Файл отформатирован так:
Это не дает мне исключения такого элемента, когда я запускаю свой код.
Полное сообщение об ошибке:
java.util.NoSuchElementException at
java.util.Scanner.throwFor(Scanner.java:862) at
java.util.Scanner.next(Scanner.java:1485) at
java.util.Scanner.nextInt(Scanner.java:2117) at
java.util.Scanner.nextInt(Scanner.java:2076) at
BabyNames.graph(BabyNames.java:75) at
BabyNames.main(BabyNames.java:13)
1 ответ
Посмотрите на свой код:
- Как пользователь, чтобы ввести имя
- Посмотрите на данный файл и найдите строку, которая начинается с данного имени и возвращает его рейтинг
- Показать этот рейтинг в пользовательском интерфейсе
Во втором вы делаете:
- Найти строку с заданным именем
- Читайте все целые числа отдельно и строите с ним строку (почему бы просто не прочитать всю строку из файла)
- Получить эту строку обратно вызывающей стороне.
В третьем вы делаете:
- Принять данную строку
- Разбейте эту строку на отдельные целые числа (опять же, почему бы не принять
List<Integer>
вместоString[] {1, 2, 3}
) - Показывать целые числа в пользовательском интерфейсе
Не забудьте закрыть Scanner
после использования может возникнуть проблема.
public static void main(String[] args) throws IOException {
List<Integer> rankings = getRankings(Paths.get("d:/names.txt"));
}
public static List<Integer> getRankings(Path path) throws IOException {
return getNameRankings(getName(), path);
}
private static String getName() {
try (Scanner scan = new Scanner(System.in)) {
System.out.print("Type a name: ");
return scan.next();
}
}
private static List<Integer> getNameRankings(String name, Path path) throws IOException {
String[] data = Files.lines(path)
.map(String::trim)
.map(line -> line.split("\\s+"))
.filter(parts -> parts[0].equalsIgnoreCase(name))
.findFirst()
.orElse(null);
if (data == null)
return Collections.emptyList();
return IntStream.range(1, data.length)
.map(i -> Integer.parseInt(data[i]))
.boxed()
.collect(Collectors.toList());
}