2014-10-26 3 views
-1

Я пытаюсь отсортировать список имен в алфавитном порядке, и я продолжаю получать ошибку Исключение в потоке «main» java.lang.NullPointerException, и я не знаю почему.java сортировка в алфавитном порядке

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

public class alphabeticalOrder { 

static String names[]; 
static int count = 0; 
static String sorting; 

public static void main(String[] args) throws IOException { 
    // TODO Auto-generated method stub 

    String[] names = new String[500]; 

    File namesFile = new File("names.txt"); 
    Scanner inputFile = new Scanner(namesFile); 

    while (inputFile.hasNextLine()) { 
    String line = inputFile.nextLine(); 
    String[] namesDetails = line.split("  "); 
    names[count] = namesDetails[0]; 
    count++; 
    } 

    sort(); 

    System.out.println(Arrays.toString(names)); 

} 

public static void sort() { 

    int namesLength = names.length; 

    for (int i = 0; i < namesLength - 1; i++) { 
    for (int j = 0; j < namesLength - 1; j++) { 
    if (names[j].compareTo(names[j - 1]) > 0) { 
    sorting = names[j - 1]; 
    names[j - 1] = names[j]; 
    names[j] = sorting; 
    } 
    } 
    } 

} 

} 

Клиенты Txt имеет эти имена

Smith, Alexandra 

Downes, Trish 

Akbal, Maria 

и массив должен быть равен 500

ответ

0

Ваш names массив имеет 500 элементов, большинство из которых являются нуль. Вот почему вы получаете NullPointerException, когда вы вызываете names[j].compareTo() для нулевой ссылки.

Вы должны попытаться отсортировать столько имен, сколько вы получите в качестве ввода.

Вместо

int namesLength = names.length; 

Попробуйте

int namesLength = count; 

count С содержит число входов вы на самом деле есть.

BTW, ваш метод сортировки() есть и другие проблемы:

  1. петля должна идти от 0 до namesLength - 1, поэтому условие должно быть j < namesLength
  2. names [j-1] даст вам ArrayIndexOutOfBoundsException когда J == 0
0

У вас есть массив размером 500 и номер вашего имени: 6.

, когда вы назначаете шесть имен первым шестью индексам массива, остальные индексы по-прежнему имеют значение null. Поэтому по сравнению с нулевым значением будет выбрасываться NullPointerException.

почему?

Потому что Объекты в Java инициализированы значением null, когда они определены в первый раз.

Предложение:

Попробуйте использовать ArrayList, который сжимается и расширяется само по себе

1

Изменить

if (names[j].compareTo(names[j - 1]) > 0) { 

в

if (names[j] != null && names[j].compareTo(names[j - 1]) > 0) { 

И исключение указатель раздражает нуль будет идти далеко.

Если вы когда-либо преодолеваете одержимость массивом 500 String, я предлагаю вам попробовать TreeSet, поскольку он будет выполнять всю сортировку для вас.

Cheat Sheet

public static void main(String[] args) 
{ 
    Set<String> alphabetical = new TreeSet<String>(); 
    alphabetical.add("A"); 
    alphabetical.add("Z"); 
    alphabetical.add("M"); 

    System.out.println(alphabetical); 
} 

выходы: [A, M, Z]

+0

Я попробовал оба пути, и я все еще возникают ошибки – programmingHelp

+0

точно, что линии? – CandiedOrange

+0

if (names [j]! = Null && names [j] .compareTo (имена [j - 1])> 0) {это и часть сортировки в основном методе, где у меня есть метод sort() – programmingHelp

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