NullPointerException для массива очереди LinkedList - PullRequest
0 голосов
/ 26 декабря 2011

Я получаю странное исключение NullPointerExcpetion в строке 20:

regs[Integer.parseInt(str.split(" ")[1]) - 1].add(line.poll());

Я не знаю, что вызвало это. Может кто-нибудь помочь мне исправить это?

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

public class shoppay
{
public static void main (String[] args) throws IOException
{
    BufferedReader f = new BufferedReader(new FileReader("shoppay.in"));
    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("shoppay.out")));
    Queue<Integer> line = new LinkedList <Integer>();
    int num = Integer.parseInt(f.readLine());
    String str;
    LinkedList<Integer>[] regs = (LinkedList<Integer>[]) new LinkedList[num];

    while ((str = f.readLine()) != null)
    {
        if (str.charAt(0) == 'C')
            line.add(Integer.parseInt(str.split(" ")[1]));
        else
            regs[Integer.parseInt(str.split(" ")[1]) - 1].add(line.poll());
    }

    out.close();
    System.exit(0);
}
}

Также я получаю предупреждение:

Безопасность типов: непроверенное приведение из java.util.LinkedList [] к java.util.LinkedList []

Это как-то связано с ошибкой?

Редактировать: ввод - это просто строка строк. Первая строка - это число, остальные - «C» или «R», за которыми следует число. Также мне нужна очередь для рег.

Ответы [ 3 ]

0 голосов
/ 26 декабря 2011

Не создавайте массив общих списков. По техническим причинам это не совсем работает. Гораздо лучше использовать список списков:

BufferedReader f = new BufferedReader(new FileReader("shoppay.in"));
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("shoppay.out")));
Queue<Integer> line = new LinkedList <Integer>();
int num = Integer.parseInt(f.readLine()); // not needed
String str;
List<List<Integer>> regs = new ArrayList<List<Integer>>(num);

for (int i = 0; i < num; ++i) {
    regs.add(new LinkedList<Integer>());
}

while ((str = f.readLine()) != null)
{
    if (str.charAt(0) == 'C')
        line.add(Integer.parseInt(str.split(" ")[1]));
    else
        regs.get(Integer.parseInt(str.split(" ")[1]) - 1).add(line.poll());
}

В качестве дополнительной проблемы есть ли причина, по которой вы используете LinkedList для regs вместо ArrayList?

0 голосов
/ 28 декабря 2011

Упс.Я передумал и решил использовать массив.(int []) Я думаю, это работало нормально

0 голосов
/ 26 декабря 2011

Не зная, как выглядит ваш ввод, я могу только догадываться о причине ошибки.Я предполагаю, что когда вы разделяете строку, вы разделяете что-то, что приводит к массиву размера 1. Знаете ли вы, что это будет с нулевым индексированием?Это означает, что первая позиция в массиве равна 0, а вторая - 1 и так далее.Если вы намеревались выбрать второй элемент в списке, убедитесь, что ваш ввод всегда будет разделен как минимум на 2 элемента.

...