2013-10-05 2 views
0

Проблема:Java NullPointerException в главном классе

После создания массива объектов FractionClass я стараюсь, чтобы дать каждой фракции числитель и знаменатель, читая в txtfile, который выглядит следующим образом:

11 12 

7 24 

2 3 

5 6 

7 9 
... 

Первое число - это числитель, а второе - знаменатель. Для этого я использую класс Scanner. В readfractions-методе я разместил комментарии, где находится NULLpointerexception.

mainfile:

package labo2oef5; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 


public class Labo2Oef5 { 

private static Breuk [] fractionArray; 
private static int amountOfLines; 

    public static void main(String[] args) throws FileNotFoundException { 
     lengteBestand(); // stel amountOfLines al in 
     readFractions(); 
     System.out.println(fractionArray[4].getNumerator()+"/"+ fractionArray[4].getDenominator());` 

    } 

    public static void readFractions() throws FileNotFoundException{ 
     Scanner lezer = new Scanner(new File("breuken01.txt")); 
     fractionArray = new Breuk[amountOfLines]; 
     for(int i=0; i<amountOfLines;i++){ 
      double numerator = (double) lezer.nextInt(); 
      double denominator = (double) lezer.nextInt(); 
      fractionArray[i].setNumerator(numerator); // HERE IT GOES WRONG, THE NULLPOINTEREXCEPTION IS HERE 
      fractionArray[i].setDenominator(denominator);// THIS LINE SUFFERS AS WELL FROM THE NULLPOINTEREXCEPTION 
      lezer.nextLine(); 
     } 

    } 

    public static int lengteBestand() throws FileNotFoundException{ 
     Scanner lezer = new Scanner(new File("breuken01.txt")); 
     amountOfLines=0; 
     while(lezer.hasNextLine()){ 
      amountOfLines++; 
      lezer.nextLine(); 
     } 
     return amountOfLines; 
    } 

} 

Breuk (голландский для фракции) Класс:

package labo2oef5; 

public class Breuk { 

    private double numerator, denominator; 

    public Breuk() { 
     numerator = 0; 
     denominator = 1; 
    } 

    public Breuk(double numerator, double denominator) { 
     this.numerator = numerator; 
     this.denominator = denominator; 
    } 

    @Override 
    public String toString() { 
     String breuk = numerator + "/" + denominator; 
     if (numerator == 0) { 
      breuk = "0"; 
     } 
     return breuk; 
    } 

    private static double grootsteGemeneDeler(double a, double b) { 
     if (a < 0 || b < 0) { 
      return grootsteGemeneDeler(Math.abs(a), Math.abs(b)); 
     } 
     if (b == 0) { 
      return a; 
     } 
     if (a < b) { 
      return grootsteGemeneDeler(b, a); 
     } 
     if (a % b != 0) { 
      return grootsteGemeneDeler(b, a % b); 
     } else { 
      return b; 
     } 
    } 

    public String normaliseer() { 

     double numerator2 = numerator/(grootsteGemeneDeler(numerator, denominator)); 
     double denominator2 = denominator/(grootsteGemeneDeler(numerator, denominator)); 
     return numerator2 + "/" + denominator2; 
    } 

    public double decimaleVorm() { 
     double decim = (double) numerator/denominator; 
     System.out.println(decim); 
     return decim; 
    } 

    public boolean isGroterDan(Breuk br) { 
     if (this.decimaleVorm() > br.decimaleVorm()) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public void vermeerderBreuk(Breuk br) { 
     this.numerator = this.numerator * br.denominator + this.denominator * br.numerator; 
     this.denominator = this.denominator * br.denominator; 
    } 

    public void produkt(Breuk br, Breuk breu) { 
     numerator = br.numerator * breu.numerator; 
     denominator = br.denominator * breu.denominator; 
    } 

    public void setNumerator(double numerator) { 
     this.numerator = numerator; 
    } 

    public void setDenominator(double denominator) { 
     this.denominator = denominator; 
    } 

    public double getNumerator() { 
     return numerator; 
    } 

    public double getDenominator(){ 
     return denominator; 
    } 
} 

оба ответа правильного ответа, я просто должен был добавить этот код под их ответ также: if (lezer.hasNextLine()) { lezer.nextLine(); }

+1

Прежде всего, Sylwek и duffymo правы. Вы не инициализировали элементы массива перед доступом к объектам/их методам настройки. Более того, было бы разумно проверить использование hasNextInt(), имеет ли ваш исходный файл целые значения: http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#hasNextInt%28 % 29 – MrSnrub

ответ

4

fractionArray[i] равна нулю, поэтому он бросает NullPointerException. Я думаю, что вы должны сделать это так:

fractionArray[i] = new Breuk(); 
fractionArray[i].setNumerator(numerator); 
fractionArray[i].setDenominator(denominator); 
+0

А, так fractionArray = new Breuk [amountOfLines]; Только помещение для 50 элементов вместо их заполнения? Итак, у меня было 50 пустых «ящиков» ... Я отредактировал ваш код и получил эту ошибку: Исключение в теме «main» java.util.NoSuchElementException: Не найдено ни одной строки \t at java.util.Scanner.nextLine (Scanner.java:1585) \t на labo2oef5.Labo2Oef5.readFractions (Labo2Oef5.java:32) \t в labo2oef5.Labo2Oef5.main (Labo2Oef5.java:18) Java Результат: 1 – BURNS

+0

Да, у вас есть 50 пустых «коробки ». Попробуйте проверить, есть ли еще несколько элементов в сканере, используя метод hasNextInt(). – Sylwek

+0

Я отредактировал это in under fractionArray [i] = new Breuk .... if (lezer.hasNextLine()) {lezer.nextLine(); } И теперь он работает как прелесть, большое спасибо :) – BURNS

3

Попробуйте это:

public static void readFractions() throws FileNotFoundException{ 
    Scanner lezer = new Scanner(new File("breuken01.txt")); 
    fractionArray = new Breuk[amountOfLines]; 
    for(int i=0; i<amountOfLines;i++){ 
     double numerator = (double) lezer.nextInt(); 
     double denominator = (double) lezer.nextInt(); 
     fractionArray[i] = new Breuk(numerator, denominator); 
     // Creating an array of references leaves them all null until you point them to something non-null by calling new 
     lezer.nextLine(); 
    } 

} 
+0

Я попробовал его, и он дал эту ошибку обратно: исключение в нити «основной» java.util.NoSuchElementException: нет линии не найдено \t на java.util.Scanner.nextLine (Scanner.java:1585) \t в labo2oef5 .Labo2Oef5.readFractions (Labo2Oef5.java:31) \t в labo2oef5.Labo2Oef5.main (Labo2Oef5.java:18) Java Результат: 1 – BURNS

+0

Я отредактированные это под fractionArray [я] = новый Breuk .... если (lezer.hasNextLine()) { lezer.nextLine(); } И это работает как очарование сейчас, спасибо большое :) – BURNS

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