reklama
Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

NullPointerException in Java

Wlcek (379)|10.5.2009 22:51
Ahoj vsichni,
mam drobny problem s programem na pocitani entropie slov. Teprve s programovanim zacinam, takze je asi napsany hodne neohrabane a zbytecne slozite. A asi v nem bude hodne chyb, ale to sem jeste nemel moznost osetrit, protoze se mi hned po startu zasekne s touhle chybovou hlasku
"Exception in thread "main" java.lang.NullPointerException"

Tady je kod, tak prosim nejakeho odpobrnika, jestli mi muze poradit. Potreboval bych, aby mi to proslo timhle ifem poked uzel nebude obsahovat zadne potomky (radek je zvyraznen ve tride "Trie").

Predem vsem dekuju za pomoc.

Vypis vystupu:
[CODE]init:
deps-jar:
compile-single:
run-single:
Exception in thread "main" java.lang.NullPointerException
at Trie.Trie.Insert(Trie.java:72)
at Trie.Trie.InsertData(Trie.java:40)
at entropie.Entropie.InsertFile(Entropie.java:23)
at entropie.Main.main(Main.java:28)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

[/CODE]

trida main, package entropie:
[CODE]
package entropie;

import java.io.*;

/**
*
* @author Wlcek
*/

public class Main
{


public static void main(String[] args) throws IOException
{
Entropie strom = new Entropie();
Entropie.INPUT_FILE = "C:\\Vstup.txt";
Entropie.OUTPUT_FILE = "C:\\Vystup.txt";
strom.InsertFile();
strom.PrintFile();
}

}
[/CODE]

trida entropie, package entropie
[CODE]

package entropie;
import java.io.*;
import Trie.*;

/**
*
* @author Wlcek
*/

public class Entropie
{
public static String INPUT_FILE;
public static String OUTPUT_FILE;
Trie strom;

@SuppressWarnings("static-access")
public void InsertFile() throws IOException
{
strom.InsertData(INPUT_FILE);
}

@SuppressWarnings("static-access")
public void PrintFile() throws IOException
{
BufferedWriter writer = new BufferedWriter(new FileWriter(OUTPUT_FILE));
writer.write(PrintHead());
DataNode buffered = new DataNode();
DataNode[] buffer = new DataNode[20];
@SuppressWarnings("static-access")
int count = strom.WordCount() - 1;
buffer[0] = strom.GetData();
do
{
int i= 1;
buffered = strom.GetData();
if(buffer[0].mCount > buffered.mCount)
{
writer.write(buffer[0].mData +" "+ buffer[0].mCount +
" "+ Entropy(buffer[0].mCount));
buffer[0] = buffered;
}
else
{
do
{
buffer = buffered;
buffered = strom.GetData();
i++;
count--;
}while(buffered.mCount == buffer[i- 1].mCount);
Sort(buffer, i);
for(int j= 0; j < i; j++)
{
writer.write(buffer[j].mData +" "+ buffer[j].mCount +
" "+ Entropy(buffer[j].mCount));
}
}
}while((--count) != 0);
}

@SuppressWarnings("static-access")
private String PrintHead()
{
return "Celkovy pocet slov: "+ strom.WordCount()
+"\nCelkovy pocet ruznych slov: "
+ strom.DifferentWordCount() +"\n----------------------------" +
"--------------\n\n";
}

@SuppressWarnings("static-access")
private double Entropy(int wordCount)
{
return logb(wordCount/strom.WordCount());
}

private double logb(double value)
{
return Math.log10(value)/Math.log10(2.0);
}

@SuppressWarnings("static-access")
private void Sort(DataNode[] data, int stop)
{
for(int i= 0; i < stop; i++)
{
data.mHash = hash(data.mData);
}
mergeSort(data, stop);
}

private int hash(String word)
{
int hash = 0;
int h = hash;
if (h == 0)
{
int off = 0;
char val[] = word.toCharArray();
int len = word.length();
for (int i = 0; i < len; i++)
{
h = 31*h + val[off++];
}
hash = h;
}
return h;
}

private void mergeSort(DataNode[] pole, int stop)
{
DataNode[] tmpPole = new DataNode[pole.length];
mergeSortRec(pole, tmpPole, 0, stop);
}

private void mergeSortRec(DataNode[] pole, DataNode[] tmpPole, int left, int right)
{
if(left < right)
{
int center = (left + right) / 2;
mergeSortRec(pole, tmpPole, left, center);
mergeSortRec(pole, tmpPole, center + 1, right);
merge(pole, tmpPole, left, center + 1, right);
}
}

@SuppressWarnings("static-access")
private void merge(DataNode[] pole, DataNode[] tmpPole, int leftPos, int rightPos, int rightEnd)
{
int leftEnd = rightPos - 1;
int tmpPos = leftPos;
int pocetPrvku = rightEnd - leftPos + 1;
while(leftPos <= leftEnd && rightPos <= rightEnd)
{
if(pole[leftPos].mHash <= pole[rightPos].mHash)
{
tmpPole[tmpPos++] = pole[leftPos++];
}
else
{
tmpPole[tmpPos++] = pole[rightPos++];
}
}
while(leftPos <= leftEnd)
{
tmpPole[tmpPos++] = pole[leftPos++];
}
while(rightPos <= rightEnd)
{
tmpPole[tmpPos++] = pole[rightPos++];
}
for(int i= 0; i < pocetPrvku; i++, rightEnd--)
{
pole[rightEnd] = tmpPole[rightEnd];
}
}

}
[/CODE]

trida trie, package trie
[CODE]

package Trie;

import java.io.*;

/**
*
* @author Wlcek
*/

public class Trie
{

private static TrieNode mRootNode = new TrieNode(0);
private static TrieNode mCurrentNode = new TrieNode();
private static int mDifferentWords = 0;

public static void InsertData(String insert) throws IOException
{
int znak = 0;
boolean aktualni = false;
boolean predchozi = false;
mCurrentNode = mRootNode;
mCurrentNode.mChild = new TrieNode[26];
BufferedReader reader = new BufferedReader(new FileReader(insert));
while((znak = reader.read()) != -1)
{
if((znak < 94) && (znak > 64))
{
znak += 32;
}
aktualni = (znak < 123) && (znak > 96);
if(aktualni)
{
Insert(znak);
predchozi = true;
}
else if(!aktualni &&predchozi)
{
Insert(znak);
predchozi = false;
mCurrentNode.mWordCount ++;
mCurrentNode = mRootNode;
mCurrentNode.mWordCount ++;
}
}
reader.close();
mDifferentWords = DifferentWords();
}

@SuppressWarnings("empty-statement")
private static void Insert(int znak)
{
int i= 0;
boolean found = true;
if(mCurrentNode.mChild == null)
{
mCurrentNode.mChild = new TrieNode[26];
mCurrentNode.mChild[0].mParent = mCurrentNode;
mCurrentNode = mCurrentNode.mChild[0];
mCurrentNode.mLetter = znak;
mCurrentNode.mWordCount = 0;
}
else
{
for(; znak != mCurrentNode.mChild.mLetter ||
i < mCurrentNode.mChild.length; i++)
{
found = false;
}
if(found)
{
mCurrentNode.mChild.mParent = mCurrentNode;
mCurrentNode = mCurrentNode.mChild;
}
else if(!found)
{
for(i= 0; mCurrentNode.mChild.mLetter != -1; i++);
mCurrentNode.mChild.mParent = mCurrentNode;
mCurrentNode = mCurrentNode.mChild;
mCurrentNode.mWordCount = 0;
}
}
}

public static int WordCount()
{
return mRootNode.mWordCount;
}

public static int DifferentWordCount()
{
return mDifferentWords;
}

@SuppressWarnings({"static-access", "empty-statement"})
public static DataNode GetData()
{
DataNode transport = new DataNode();
int[] data = new int[20];
int index;
data = Max(mRootNode);
transport.mCount = data[0];
mCurrentNode = mRootNode;
for(index= data.length; data[index] != -1; index--);
for(; index > 0; index--)
{
mCurrentNode = mCurrentNode.mChild[data[index]];
transport.mData =
transport.mData.concat(String.valueOf(mCurrentNode.mLetter));
if(index == 1)
{
mCurrentNode.mWordCount = 0;
}
}
return transport;
}

@SuppressWarnings("empty-statement")
private static int[] Max(TrieNode currentNode)
{
int[] ret = new int[20];
int[][] max = new int[20][];
if(currentNode.mChild == null)
{
ret[0] = currentNode.mWordCount;
for(int i= 1; i < max.length; i++)
{
ret = -1;
}
}
else if(currentNode.mWordCount != mRootNode.mWordCount)
{
for(int i= 0; i < currentNode.mChild.length; i++)
{
max = Max(currentNode.mChild);
}
ret = FindMax(max);
if(currentNode.mWordCount > ret[0])
{
ret = new int[20];
ret[0] = currentNode.mWordCount;
for(int i= 1; i < max.length; i++)
{
ret = -1;
}
}
else
{
int j= 0;
for(; ret[j] != -1; j++);
ret[j] = ret[ret.length - 1];
ret[ret.length - 1] = -1;
}
}
else
{
for(int i= 0; i < currentNode.mChild.length; i++)
{
max = Max(currentNode.mChild);
}
ret = FindMax(max);
int j= 0;
for(; ret[j] != -1; j++);
ret[j] = ret[ret.length - 1];
ret[ret.length - 1] = -1;
}
return ret;
}

private static int[] FindMax(int[][] data)
{
int maxValue = 0;
int index = 0;
for(int i= 0; i < data.length; i++)
{
if(data[0] > maxValue)
{
maxValue = data[0];
index = i;
}
}
data[index][data.length - 1] = index;
return data[index];
}

private static int DifferentWords()
{
int count = 0;
TrieNode CurrentNode = mRootNode;
for(int i= 0; i < 20; i++)
{
count += Words(CurrentNode.mChild);
}
return count;
}

private static int Words(TrieNode CurrentNode)
{
int count = 0;
if(CurrentNode.mChild != null)
{
for(int i= 0; i < 20; i++)
{
count += Words(CurrentNode);
}
}
if(CurrentNode.mWordCount != 0 &&
CurrentNode.mWordCount != -1)
{
count += 1;
}
return count;
}


}
[/CODE]

trida trieNode, package trie
[CODE]

package Trie;

/**
*
* @author Wlcek
*/

public class TrieNode
{

public TrieNode[] mChild = null;
public TrieNode mParent = null;
public int mLetter = -1;
public int mWordCount = -1;

public TrieNode(int letter, int wordCount)
{
mLetter = letter;
mWordCount = wordCount;
}

public TrieNode(char letter, int wordCount)
{
mLetter = (int)letter;
mWordCount = wordCount;
}

public TrieNode(char letter)
{
mLetter = (int)letter;
}

public TrieNode(int wordCount)
{
mWordCount = wordCount;
}

public TrieNode()
{
}
}
[/CODE]

trida dataNode, package trie //pouzivam k predavani ruznorodych dat mezi tridami
[CODE]
package Trie;

/**
*
* @author Wlcek
*/

public class DataNode
{
public static String mData = "";
public static int mCount = 0;
public static int mHash = 0;
}[/CODE]


EDIT: Tak puvodni problem sem po osmi hodinach marne prace a prepracovavani celeho kodu vyresil restartem vyvojoveho prostredi NetBeans. Nicmene Se vyskytl stejny problem o kousek dale, protoze mi neprojde zvyraznena podminka.
mstejska (2912)|11.5.2009 08:52
mCurrentNode.mChild = new TrieNode[26];
Tohle ti neudela 26 Trinodu, ale pouze pole pro 26 TriNodu, musis pro kazdy Trinode v poli naplnit.
Viz tenhle priklad
public static void main(String[] args) throws IOException
{

String tmpS[] = new String[20];
System.out.println(tmpS[0].toString() + tmpS[1].toString());

}
taky ti to hodi NPE.

public static void InsertData(String insert) throws IOException
{
int znak = 0;
boolean aktualni = false;
boolean predchozi = false;
mCurrentNode = mRootNode;
mCurrentNode.mChild = new TrieNode[26]; <= tady se ti to spatne inicializuje (Podle meho)

PS: Kdyz budu mit vecer cas, tak se na to jeste mrknu. Schvalne se podivej jestli ti nejaky kod vola constructory TrieNode
Wlcek (379)|11.5.2009 10:05
Ahoj,
to sem si vubec neuvedomil a nebyl sem schopny si toho vimnout. Ale v tom pripade je pak
mCurrentNode.mChild[0] == null
tak proc mi to neprojde tou podminkou??

EDIT: Tak sem pridal cyklus zaplneni pole uzly a podminku zmenil na
mCurrentNode.mChild[0].mLetter == -1
mstejska (2912)|11.5.2009 10:41
[QUOTE=Wlcek;248052]...
mCurrentNode.mChild[0] == null
tak proc mi to neprojde tou podminkou??
[/QUOTE]

A kde mas takovou podminku? Mas tam pouze
if(mCurrentNode.mChild == null)
viz asi 55 radek, a to pole samozrejme neni null, je inicializovane.
Wlcek (379)|11.5.2009 11:06
Ono uz to nejde editovat, tak sem to tam nemohl zmenit. Ale u sebe mam napsano
mCurrentNode.mChild[0] = null;
stejne mi to vraci NullPointerException

Ale ted si vsimam, ze se mi cele vyvojove prostredi chova nejak divne. Dal sem cast kodu do komentare /* */ a ono to s nim stejne pracuje...
Pokud to nenni schopne rozeznat zmenu v kodu, tak to asi nikdy neodladim, pokud to vubec pujde.

EDIT:
tak Insert mam ted takhle:

trida trie/ package trie
[CODE] @SuppressWarnings("empty-statement")
private static void Insert(int znak)
{
int i= 0;
boolean found = true;
if(mCurrentNode.mChild[0] == null)
{
mCurrentNode.mChild[0] = new TrieNode();
mCurrentNode.mChild[0].mParent = mCurrentNode;
mCurrentNode = mCurrentNode.mChild[0];
mCurrentNode.mLetter = znak;
mCurrentNode.mWordCount = 0;
}
else
{
for(; znak != mCurrentNode.mChild.mLetter ||
i < mCurrentNode.mChild.length; i++)
{
found = false;
}
if(found)
{
mCurrentNode.mChild.mParent = mCurrentNode;
mCurrentNode = mCurrentNode.mChild;
}
else if(!found)
{
for(i= 0; mCurrentNode.mChild.mLetter != -1; i++);
mCurrentNode.mChild.mParent = mCurrentNode;
mCurrentNode = mCurrentNode.mChild;
mCurrentNode.mWordCount = 0;
}
}
}[/CODE]
mstejska (2912)|11.5.2009 11:15
Jako IDE pouzivam Eclipse.
PS: Pak muzes mit problem s prostredim.
PPS: konvence nazvu metod je prvni pismeno male. (to je pouze konvence)
Jako strom muzes pouzivat DefaultTreeModel
Pro sorteni Collections.sort()
jako jmeno getteru promenne se pouziva getJmenoPromenne() atd
Wlcek (379)|11.5.2009 12:02
Pozadavkem bylo, struktury a trideni naimplementovana zvlast, zadne defaultni funkce.
S tim pojmenovanim sem se moc neparal, to je pravda, pripadalo mi to nejake divne :-)
Jeste to upravim.

@ PS: Mam ho zkusit preinstalovat?? Pouzivam NetBeans.
mstejska (2912)|11.5.2009 12:06
[QUOTE=Wlcek;248096]Pozadavkem bylo, struktury a trideni naimplementovana zvlast, zadne defaultni funkce.
S tim pojmenovanim sem se moc neparal, to je pravda, pripadalo mi to nejake divne :-)
Jeste to upravim.

@ PS: Mam ho zkusit preinstalovat?? Pouzivam NetBeans.[/QUOTE]

Aha
Eclipse nemusis instalovat, staci rozbalit a spustit. (ma asi 100MB)
V NetBeans ti neporadim, V eclipse delam 5 let.
Wlcek (379)|13.5.2009 03:28
Tak sem to trochu predelal, a az na jeden detajl mi to myslim funguje. A tim je, ze po nalezeni maxima ve stromu, bych mu potreboval smazat promennou mWordCount, ale to muzu az po projiti celeho stromu. Jenze to se mi vzdycky prepise odkaz na dany uzel, uchovavany v pomocnem uzlu. Zvirazneno cervene (package Trie, class Trie, funkce getMax).

Mate nekdo nejaky napad?? Me uz to moc nemysli.

trida main, package entropie:
[CODE]
package entropie;

import java.io.*;

/**
*
* @author Wlcek
*/

public class Main
{


public static void main(String[] args) throws IOException
{
Entropie strom = new Entropie();
Entropie.INPUT_FILE = "C:\\Vstup.txt";
Entropie.OUTPUT_FILE = "C:\\Vystup.txt";
strom.InsertFile();
strom.PrintFile();
}

}
[/CODE]

trida entropie, package entropie
[CODE]
package entropie;
import java.io.*;
import Trie.*;

/**
*
* @author Wlcek
*/
public class Entropie
{
public static String INPUT_FILE;
public static String OUTPUT_FILE;
Trie strom;

@SuppressWarnings("static-access")
public void insertFile() throws IOException
{
strom.insertData(INPUT_FILE);
}

public void printFile() throws IOException
{
printData(OUTPUT_FILE);
}

@SuppressWarnings("static-access")
private void printData(String output) throws IOException
{
int words = strom.getDifferentWordCount();
BufferedWriter writer = new BufferedWriter(new FileWriter(output));
writer.write(printHead());
do
{
DataNode tmp = strom.getMaxValue();
writer.write(tmp.mData +" "+ tmp.mCount +" "
+ entropy(tmp.mCount) +"\n");
words--;
}while(words > 0);
writer.close();
}

@SuppressWarnings("static-access")
private String printHead()
{
return "Celkovy pocet slov: "+ strom.getWordCount()
+"\nCelkovy pocet ruznych slov: "
+ strom.getDifferentWordCount() +"\n----------------------------" +
"--------------\n\n";
}

@SuppressWarnings("static-access")
private double entropy(int wordCount)
{
return logb(strom.getWordCount()/wordCount);
}

private double logb(double value)
{
return Math.log10(value)/Math.log10(2.0);
}

}

[/CODE]

trida trie, package trie
[CODE]
package Trie;

import java.io.*;



/**
*
* @author Wlcek
*/
public class Trie
{

private static TrieNode mRootNode = new TrieNode(0);
private static TrieNode mCurrentNode;
private static int mDifferentWordCount = 0;
private static int mWordCount = 0;

public static void insertData(String input) throws IOException
{
int znak = 0;
boolean aktualni = false;
boolean predchozi = false;
mRootNode.mChild = new TrieNode[26];
mCurrentNode = mRootNode;
BufferedReader reader = new BufferedReader(new FileReader(input));
while((znak = reader.read()) != -1)
{
if((znak < 94) && (znak > 64))
{
znak += 32;
}
aktualni = (znak < 123) && (znak > 96);
if(aktualni)
{
insert(znak);
predchozi = true;
}
else if(!aktualni && predchozi)
{
predchozi = false;
if(mCurrentNode.mWordCount == 0)
{
mDifferentWordCount++;
}
mCurrentNode.mWordCount ++;
mCurrentNode = mRootNode;
mWordCount ++;
}
}
reader.close();
}

@SuppressWarnings("empty-statement")
private static void insert(int znak)
{
int i= 0, j= 0;
for(; mCurrentNode.mChild != null; i++);
if(i > 0)
{
for(j= 0; j < i && mCurrentNode.mChild[j].mLetter != znak; j++);
if(j < i)
{
if(mCurrentNode.mChild[j].mLetter == znak)
{
i = j;
}
}
}
if(mCurrentNode.mChild == null)
{
mCurrentNode.mChild = new TrieNode();
mCurrentNode.mChild.mParent = mCurrentNode;
mCurrentNode = mCurrentNode.mChild;
mCurrentNode.mLetter = znak;
mCurrentNode.mWordCount ++;
}
else if(mCurrentNode.mChild.mLetter == znak)
{
mCurrentNode = mCurrentNode.mChild;
}
}

public static int getWordCount()
{
return mWordCount;
}

public static int getDifferentWordCount()
{
return mDifferentWordCount;
}

public static DataNode getMaxValue()
{
DataNode data = getMax(mRootNode);
data.mDelete.mWordCount = 0;
return data;
}

@SuppressWarnings({"static-access", "empty-statement"})
public static DataNode getMax(TrieNode currentNode)
{
String word = new String();
int[] tmp = new int[20];
TrieNode helpNode;
DataNode currentMax = new DataNode(); //pomocny uzel pro uchovani dat tykajicich se maxima
DataNode help = new DataNode();
int i= 0;
int j = 0;
for(; i < 26 && currentNode.mChild != null; i++)
{
currentMax = getMax(currentNode.mChild);
}
if(currentMax.mCount < currentNode.mWordCount)
{
currentMax.mCount = currentNode.mWordCount;
helpNode = currentNode;
for(; helpNode != mRootNode; j++)
{
tmp[j] = helpNode.mLetter;
helpNode = helpNode.mParent;
}
for(j -= 1; j >= 0; j--)
{
word = word.concat(String.valueOf((char)tmp[j]));
}
currentMax.mData = word;
currentMax.mDelete = currentNode;
}
else if(currentMax.mCount == currentNode.mWordCount)
{
helpNode = currentNode;
for(; helpNode != mRootNode; j++)
{
tmp[j] = helpNode.mLetter;
helpNode = helpNode.mParent;
}
for(j -= 1; j >= 0; j--)
{
word = word.concat(String.valueOf((char)tmp[j]));
}
for(j= 0;currentMax.mData.charAt(j) == word.charAt(j) &&
(j < currentMax.mData.length() -1 || j < word.length() - 1); j++);
if(word.charAt(j) < currentMax.mData.charAt(j))
{
currentMax.mCount = currentNode.mWordCount;
currentMax.mData = word;
currentMax.mDelete = currentNode;
}
}
return currentMax;
}

}
[/CODE]

trida trieNode, package trie
[CODE]
package Trie;

/**
*
* @author Wlcek
*/

public class TrieNode
{

public TrieNode[] mChild = null;
public TrieNode mParent = null;
public int mLetter = -1;
public int mWordCount = -1;

public TrieNode(int letter, int wordCount)
{
mLetter = letter;
mWordCount = wordCount;
}

public TrieNode(char letter, int wordCount)
{
mLetter = (int)letter;
mWordCount = wordCount;
}

public TrieNode(char letter)
{
mLetter = (int)letter;
}

public TrieNode(int wordCount)
{
mWordCount = wordCount;
}

public TrieNode()
{
}
}
[/CODE]

trida dataNode, package trie //pouzivam k predavani ruznorodych dat mezi tridami
[CODE]
package Trie;

package Trie;

/**
*
* @author Wlcek
*/
public class DataNode
{
public static String mData = new String();
public static int mCount = 0;
TrieNode mDelete = new TrieNode();
}[/CODE]

myslel sem ze se mi tam ten odkaz ulozi vzdy, kdyz budu ukladat hodnotu mData a mCount, ale prepise se to pokazde kdyz vytvorim pomocny uzel, pokazde kdyz se funkce sama zavola. Jen mData a mCount zustanou stejna dokud nenajdu nove maximum.