Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Exception in thread "main"


Автор: SectoR 26.10.2010, 09:07
Есть класс PrivateSectorPersons с методом ViewPerson:
Код

      public static void ViewPerson(PrivateSectorPersons pers)
          {
              System.out.println(pers.surname+" "+pers.name+" "+pers.secondname);
          } // ViewPerson


Есть Main класс
Код

      public class Main {
       
          public static PrivateSectorPersons parseRow(Cell[] row)
          {
              // Промежуточные переменные:
       
              // Проголосовавший:
              // код ЛС, флаг ответственности, ФИО, дата рождения, пол
              int ls_code;
              boolean otv;
              String name, surname, secondname;
              java.util.Date birthday;
              char sex;
       
              // др. переменные...
       
       
              // Собственно парсим строку, записывая значения ячеек в промежуточные переменные:
       
              // Проголосовавший:
              // код ЛС
              if (row[1].getType() == CellType.NUMBER)
              {
                  NumberCell cell = (NumberCell) row[1];
                  ls_code = (int)cell.getValue();
              }
              else return null;
              // флаг ответственности
              if (row[2].getType() == CellType.BOOLEAN)
              {
                  BooleanCell cell = (BooleanCell) row[2];
                  otv = cell.getValue();
              }
              else return null;
              // фамилия
              if (row[3].getType() == CellType.LABEL)
              {
                LabelCell cell = (LabelCell) row[3];
                name = cell.getString();
              }
              else return null;
              // имя
              if (row[4].getType() == CellType.LABEL)
              {
                LabelCell cell = (LabelCell) row[4];
                surname = cell.getString();
              }
              else return null;
              // отчество
              if (row[5].getType() == CellType.LABEL)
              {
                LabelCell cell = (LabelCell) row[5];
                secondname = cell.getString();
              }
              else return null;
              // дата рождения
              if (row[6].getType() == CellType.DATE)
              {
                DateCell cell = (DateCell) row[6];
                birthday = cell.getDate();
              }
              else return null;
              // пол
              if (row[14].getType() == CellType.LABEL)
              {
                LabelCell cell = (LabelCell) row[14];
                sex = (cell.getString().toCharArray())[0];
              }
              else return null;
       
              // остальное...
       
       
              // Вызываем конструктор, создающий объект
              return new exceltest.PrivateSectorPersons(ls_code, otv, surname, name, secondname, birthday, sex,
              district, sattlement, street, home, flat,
              country, region, district_, sattlement_,
              doc_type, series, number, issue_place, issued, issue_date);
       
          } // parseRow
       
       
          /**
          * @param args the command line arguments
          */
          public static void main(String[] args) {
       
              try {
       
                  // Открываем Excel-книгу для работы:
                  Workbook workbook = Workbook.getWorkbook(new File("e:\\Projects\\JDBC, Excel\\test.xls"));
       
                  int SheetsNumber = workbook.getNumberOfSheets();
                  System.out.println("Sheets Count: " + SheetsNumber);
       
                  // Ссылка на лист
                  Sheet sheet;
       
                  // Количество столбцов и строк в листе
                  int columns, rows;
       
                  // Список персон из частного сектора
                  List persons = new ArrayList();
       
       
                      // Открываем лист и
                      // считываем количество стобцов и строк в нем
                      sheet = workbook.getSheet(0);
                      columns = sheet.getColumns();
                      rows = sheet.getRows();
       
                      // Выводим информацию
                      System.out.println("Sheet Number: "+ 0);
                      System.out.println("Columns: " + columns + " Rows: " + rows);
       
                      // Ячейки строки
                      Cell[] row;
       
                      // Персона из частного сектора
                      PrivateSectorPersons pers;
       
                      // Считываем ячейки в массив
                      for(int k=0; k<rows; k++)
                      {
                          row = sheet.getRow(k);
       
                          persons.add(parseRow(row));
                      }
       
                      // Просмотр коллекции с помощью итератора
                      Iterator i = persons.iterator();
                      while(i.hasNext())
                      {
                          pers = (PrivateSectorPersons)i.next();
                          PrivateSectorPersons.ViewPerson(pers);
                      }
       
                      // Просмотр коллекции
                      //for(int i=0; i<persons.size(); i++)
                      //{
                      //    PrivateSectorPersons.ViewPerson((PrivateSectorPersons) persons.get(0));
                      //}
       
       
       
                  // Закрываем Excel-книгу
                  workbook.close();
       
              } catch (IOException ex) {
       
                  Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
              } catch (BiffException ex) {
       
                  Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
              }
       
              System.out.println("The End.");
          } // main method
      } // Main class


не удается просмотреть данные ни с помощью for ни с помощью Iterator((
Код

      // Просмотр коллекции с помощью итератора
                      Iterator i = persons.iterator();
                      while(i.hasNext())
                      {
                          pers = (PrivateSectorPersons)i.next();
                          PrivateSectorPersons.ViewPerson(pers);
                      }
       
                      // Просмотр коллекции
                      //for(int i=0; i<persons.size(); i++)
                      //{
                      //    PrivateSectorPersons.ViewPerson((PrivateSectorPersons) persons.get(0));
                      //}


Компилятор выплевывает следующее:
Цитата


run:
Sheets Count: 13
Sheet Number: 0
Columns: 35 Rows: 1500
Exception in thread "main" java.lang.NullPointerException
at exceltest.PrivateSectorPersons.ViewPerson(PrivateSectorPersons.java:81)
at exceltest.Main.main(Main.java:277)
Java Result: 1
BUILD SUCCESSFUL (total time: 1 second)


81 строка в первом листинге:
System.out.println(pers.surname+" "+pers.name+" "+pers.secondname);

277 вызов ViewPerson
PrivateSectorPersons.ViewPerson(pers);

Подскажите как сделать правильно? 

Автор: jk1 26.10.2010, 10:32
У вас срабатывает вот эта ветка второго листинга
Код

 else return null;

поэтому в коллекцию на каком-то из этапов попадает null. Итератор все нормально проходит, просто однажды возвращает null, который затем попадает вот сюда
Код

public static void ViewPerson(PrivateSectorPersons pers)
          {
              System.out.println(pers.surname+" "+pers.name+" "+pers.secondname);
          }

а уже операции с null приводят к вполне закономерному результату.
Цитата

Подскажите как сделать правильно? 

Исправлять вот эту логику
Код

if (row[1].getType() == CellType.NUMBER)
              {
                  NumberCell cell = (NumberCell) row[1];
                  ls_code = (int)cell.getValue();
              }
              else return null;
              // флаг ответственности
              if (row[2].getType() == CellType.BOOLEAN)
              {
                  BooleanCell cell = (BooleanCell) row[2];
                  otv = cell.getValue();
              }
              else return null;
              // фамилия
              if (row[3].getType() == CellType.LABEL)
              {
                LabelCell cell = (LabelCell) row[3];
                name = cell.getString();
              }
              else return null;
              // имя
              if (row[4].getType() == CellType.LABEL)
              {
                LabelCell cell = (LabelCell) row[4];
                surname = cell.getString();
              }
              else return null;
              // отчество
              if (row[5].getType() == CellType.LABEL)
              {
                LabelCell cell = (LabelCell) row[5];
                secondname = cell.getString();
              }
              else return null;
              // дата рождения
              if (row[6].getType() == CellType.DATE)
              {
                DateCell cell = (DateCell) row[6];
                birthday = cell.getDate();
              }
              else return null;
              // пол
              if (row[14].getType() == CellType.LABEL)
              {
                LabelCell cell = (LabelCell) row[14];
                sex = (cell.getString().toCharArray())[0];
              }
              else return null;

Я особенностей вашей задачи не знаю, но возвращение null по поводу и без повода выглядит довольно странно.

Автор: SectoR 27.10.2010, 08:30
спасибо - я вчера разобрался...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)