-2

Вот мой код:не могу понять ClassNotFoundException ошибку

Геттеры, Сеттеры, импорт исключены

Часть Класс:

public class Part{ 
    private String name; 
    private String id; 
    private int quantity; 
    private BigDecimal purchaseprice; 
    private BigDecimal saleprice; 
    private ArrayList<String> subparts; 
    private String description; 

    public Part(String File, String ID) 
    { 
     Part TempP = DataAccess.getPart(File, ID); 
     this.name = TempP.name; 
     this.id = TempP.id; 
     this.quantity = TempP.quantity; 
     this.purchaseprice = TempP.purchaseprice; 
     this.saleprice = TempP.saleprice; 
     this.subparts = TempP.subparts; 
     this.description = TempP.description; 
    } 

    public Part(){} 

    public Part(String name, String id, int quantity, BigDecimal purchaseprice, 
      BigDecimal saleprice, ArrayList<String> subparts, String description) { 
     this.name = name; 
     this.id = id; 
     this.quantity = quantity; 
     this.purchaseprice = purchaseprice; 
     this.saleprice = saleprice; 
     this.subparts = subparts; 
     this.description = description; 
    } 

Доступ к данным Класс:

public class DataAccess 
{  
    public static ArrayList<Part> getAllParts(String aFile){ 
     ArrayList<Part> PartList = new ArrayList<Part>(); 
     try{ 
      BufferedReader fin = new BufferedReader(new FileReader(aFile)); 
      while(true){ 
       String TempS[]; 
       TempS = fin.readLine().split(","); 
       if(TempS[0] == null){break;} 
       ArrayList<String> subparts = new ArrayList<String>(); 
       for(int i = 6; i < TempS.length; i++){ 
        subparts.add(TempS[i]); 
       } 
       PartList.add(new Part(TempS[1], TempS[0],Integer.valueOf(TempS[2]),BigDecimal.valueOf(Double.valueOf(TempS[3])),BigDecimal.valueOf(Double.valueOf(TempS[4])),subparts,TempS[5])); 
      } 
      fin.close(); 
      return PartList; 
     }catch(FileNotFoundException ex) 
     { 
      return PartList; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return PartList; 
    } 

Так что проблема в том, что она отлично работает как и планировалось до тех пор, пока он не достигнет PartList.add(new Part(TempS[1], TempS[0],Integer.valueOf(TempS[2]),BigDecimal.valueOf(Double.valueOf(TempS[3])),BigDecimal.valueOf(Double.valueOf(TempS[4])),subparts,TempS[5]));, а затем он выбрасывает ClassNotFoundException, я проследил его полностью через отладчик eclipse, и все данные верны ... Может ли кто-нибудь сказать мне, что я сделал неправильно? и любые другие предложения для моего кода будут оценены, а также ...

Exception in thread "main" java.lang.NullPointerException 
    at DataAccess.getAllParts(DataAccess.java:42) 
    at MainController.SummonParts(MainController.java:38) 
    at MainController.main(MainController.java:11) 

отладчик читает Ошибка ClassNotFound на линии 48, прежде чем он выходит из строя ...

+1

Пожалуйста, введите трассировку стека – Ashish

+0

Исключение класса ClassNotFoundException связано с путями классов, загрузкой классов и т. Д. Не относится к данным. Возможно, вам не хватает некоторых библиотек? – Jayan

+0

Какой класс отсутствует? И не обнаруживается ли во время компиляции или запуска? – greedybuddha

ответ

0
  • 6 - это магическое число; замените его символьной константой. На самом деле, сделать то же самое для 0, 1 и т.д.
  • Вы еще не следуя соглашения об именовании Java:
    • Переменные camelCased.
    • Классы капитализируются и CamelCased.
    • Перечисления: ALL_CAPS_WITH_UNDERSCORES.
  • Ваши имена должны быть более конкретными. TempS и DataAccess ничего не говорят о типе объекта, с которым они имеют дело.
    • Возможно, PartDAO вместо DataAccess.
    • Возможно, partData вместо TempS.
  • И, пожалуйста, не используйте статику так много. Попросите свой метод main инициализировать объект и сообщить ему, чтобы он выполнял работу. Таким образом, вы можете разделить свой метод на более мелкие, которые вы можете проверить.
  • Закройте свои потоки в finally или используйте Java 7 try-with-resources.
  • FileNotFoundException не следует игнорировать, просто возвращая пустой список.
  • Предпочитаете систему регистрации более e.printStackTrace(). Посмотрите на logback.
  • Не объявляйте свои переменные как ArrayList s; программ для интерфейса и сделать их List s.
  • Отформатируйте свой код, чтобы вы не проходили мимо столбца 80 или около того.
  • BufferedReader.readLine() возвращает null в конец файла. Таким образом, программа достигает конца файла, она вызывает null.split(",").
  • Есть ли вероятность, что вы будете иметь дело с файлами csv, включают экраны, потому что у элемента есть запятая или цитата? Посмотрите на библиотеки csv.
  • BigDecimal.valueOf(Double.valueOf(TempS[3])) Слишком сложно. Фактически, у BigDecimal есть конструктор, который принимает String, и это предпочтительнее. Итак, new BigDecimal(TempS[3]) лучше. С другой стороны, есть ли вероятность, что файл может содержать $19.38, а не 19.38? Вместо этого вы можете посмотреть на MessageFormat.
+0

Извините за соглашения об именах, которые мы никогда не рассматривали в классе. Я исправил его с помощью 'null.split (", ")' Спасибо ... – Sniz

+0

См. Http://www.oracle.com/technetwork/java/codeconv-138413.html для официального слова oracle. Это было написано до перечислений. Если вы не будете следовать им, опытные читатели будут запутаны. –

1
ArrayList<Part> PartList = null; 

, а затем

PartList.add(...); 

приводит к NPE - NullPointerException

EDIT

Я предлагаю вам изменить while петлю на что-то вроде этого:

String line;   
    while((line=fin.readLine()) != null){ 
     String[] TempS = line.split(","); 
     ArrayList<String> subparts = new ArrayList<String>(); 
     for(int i = 6; i < TempS.length; i++){ 
      subparts.add(TempS[i]); 
     } 
     PartList.add(new Part(TempS[1], TempS[0],Integer.valueOf(TempS[2]),BigDecimal.valueOf(Double.valueOf(TempS[3])),BigDecimal.valueOf(Double.valueOf(TempS[4])),subparts,TempS[5])); 
    } 

Пожалуйста, обратите внимание, что я просто показывает логику. Возможно, у вас есть другие ошибки.

+0

Я использую 'ArrayList subparts = new ArrayList ();' not '= null' – Sniz

+0

PM Правильно, вы не создаете PartList, а не subparts. Вам также необходимо создать ArrayList PartList = new ArrayList (); –

+0

Проблема не в 'subparts', а в' PartList'. Вы вызываете 'add()' метод на объект 'null'. –

0

Одна вещь, которая выскочила на меня, вы полагаетесь на внутреннее условие, чтобы разбить цикл. Вместо этого, вы можете использовать тест как часть цикла while как

BufferedReader fin = new BufferedReader(new FileReader(aFile)); 
String line = fin.readLine(); 
while (line != null) { 
    //execute code here 
    line = fin.readLine(); 
} 

Это лучше, потому что вам не придется беспокоиться о работе с нулевыми значениями внутри цикла и может избавиться от этого заявления излома внутри цикла while.

Кроме того, вы можете быть уверены , что у вас есть BufferedReader, FileReader и Part классы в операторы импорта? Если вы не можете создать новый Part, это вызовет NPE в этой строке.

Чтобы проверить, если вы можете получить доступ к Part объекту:

Part newPart = new Part(/*add all constructor args*/); 
if (newPart != null) { 
    System.out.println("Non-null Part"); 
    partList.add(newPart); 
} 

Если вы получаете выход консоли, то объект части был добавлен в список. Если это не так, вот где ваша ошибка.

+0

Да, все это работает отлично, я сделал достаточно с файловым вводом-выводом в классе, чтобы знать, как их настроить, я просто не знал, как эффективно передать эти данные в новый класс. – Sniz

Смежные вопросы