Gå til innhold

[Løst] Tekst sorterings funksjon krasjer på andre run!


Anbefalte innlegg

Hei folkens!

Driver å fikler litt med java og android, og har da konvertert noen av elementene fra min c++ chatbot til java, men har ett problem, andre gangen denne funksjonen blir called, så force closer appen, ser ikke hva som er galt! Funksjonen er i activity classen.

 

public void AI(String text) {
 // initiate new lists to be on the safe side
 List<String> indexer = new ArrayList<String>();
 List<String> sentence = new ArrayList<String>();
 List<String> explode = new ArrayList<String>();
 List<String> ary = new ArrayList<String>();
 explode = Arrays.asList(text.split(" "));
 // initiate randint and trigger variable
 Random rand = new Random();
 int randint = rand.nextInt(explode.size());
 // initiate the trigger variable
 String trigger = explode.get(randint);
 // check if word exists in database and add if it not.
 for (int i = 0; i < explode.size(); i++) {
  String word = explode.get(i);
  if (common.get(word) == null) {
   words.add(word);
   common.put(word, 1);
   context.put(word, explode);
   pos.put(word, i);
   length.put(word, explode.size());
  } else {
   // increase the weight of common if the word repeats
   common.put(word, common.get(word) + 1);
  }
 }
 // check if context with index set as trigger is empty, if not, copy the
 // arraylist to the ary variable
 if (!context.get(trigger).isEmpty()) {
  Collections.copy(ary, context.get(trigger));
 }
 // fill the arraylist sentence with words to be used, some in context,
 // some random from the database.
 for (int i2 = 0; i2 < length.get(trigger); i2++) {
  randint = rand.nextInt(length.get(trigger));
  if (randint < length.get(trigger) / 2) {
   if (ary.get(i2) != null) {
 sentence.add(ary.get(i2));
   }
  } else {
   sentence.add(words.get(rand.nextInt(words.size())));
  }
 }
 // use to the pos-hashmap to check at which index the word was detected
 // at, if not place it at the deliberate index.
 for (int i3 = 0; i3 < sentence.size(); i3++) {
  if (sentence.get(i3) != null) {
   indexer.add(pos.get(sentence.get(i3)), sentence.get(i3));
  }
 }
 // compose the final string that is to be passed to the speak function
 for (int i4 = 0; i4 < indexer.size(); i4++) {
  say = say + indexer.get(i4) + " ";
 }
 // pass the string to the speak function
 mTts.speak(say, TextToSpeech.QUEUE_FLUSH, null);
 // removing final string to be ready for next iteration
 say = "";
 // end of AI stuff
}

 

Med henholdsvis:

// arraylists
public List<String> explode = new ArrayList<String>();
public List<String> words = new ArrayList<String>();
public List<String> sentence = new ArrayList<String>();
public List<String> indexer = new ArrayList<String>();
// hashmaps
public Map<String, Integer> common = new HashMap<String, Integer>();
public Map<String, List<String>> context = new HashMap<String, List<String>>();
public Map<String, Integer> pos = new HashMap<String, Integer>();
public Map<String, Integer> length = new HashMap<String, Integer>();
// strings
public String say;

Endret av Leif.ross
Lenke til kommentar
Videoannonse
Annonse

Om du kobler telefonen til pcen og aktiverer debugmodus, kan du lese telefonstatus igjennom LogCat på pcen. Der får du også opp stacktrace til hva som får appen til å forceclose. Du kan også evt. sette et break point i toppen av funksjonen, og så starte i debugmodus og følge hva som skjer i programmet.

 

Om dette er en funksjon som skal kalles ofte, ville jeg sett på å bruke noe annet enn vanlig string med + i loopen (altså, SAY = SAY + INDEXER.get...)

Siden String er immutable, vil det allokere en ny String hver gang, der innholdet i den gamle må kopieres over. Bruk StringBuilder i stedet.

 

Ang. koden er den veldig uleselig, i hvert fall med Javaøyne.

Lenke til kommentar

Haha, ja, jeg burde kanskje begynne med skikkelig formatering av koden min, får utrolig mye pes for det av så og si alle som er uheldige nok til å rote seg inn på an! :p

 

Men!

Fant ut at problemet var at jeg satte INDEXER og Sentence til null i slutten av funksjonen, derfor så fikk jeg en nullpointerexception! :p

Nå fungerer funksjonen, men krasjer fortsatt vis jeg gir den mer enn 3 ord.

 

Logcat skriker på denne linja, noen ideer?

  if(!Context.get(Trigger).isEmpty()) {
Collections.copy( Array, Context.get(Trigger));}

 

Førstepost oppdatert med ny kode.

 

Feilkode:

05-25 11:05:33.657: E/AndroidRuntime(412): Uncaught handler: thread main exiting due to uncaught exception
05-25 11:05:33.665: E/AndroidRuntime(412): java.lang.ArrayIndexOutOfBoundsException
05-25 11:05:33.665: E/AndroidRuntime(412):  at java.util.Collections.copy(Collections.java:1593)
05-25 11:05:33.665: E/AndroidRuntime(412):  at sarah.namespace.SarahActivity.AI(SarahActivity.java:152)

Endret av Leif.ross
Lenke til kommentar

All den tid du bruker store forbokstaver på variabler, eller variabler i caps, er koden din helt uleselig, beklager. Da får du også slike feil som nå veldig lett. Det er veldig tungvindt å se om du faktisk kaller en statisk metode (sånn som Collections.copy() ) eller om det er en metode på et initialisert objekt. Hvorfor skriver du ikke koden skikkelig?

 

Sett en breakpoint like før i koden, så ser du fort hva som går feil.

Endret av Matsemann
Lenke til kommentar

Kommer ifra et språk der alle variabler må ha stor forbokstav, så det ble ganske naturlig for meg, men skal prøve å venne meg til små bokstaver i variabler.

Dette er første gang jeg skriver noe i java, så har egentlig ikke peiling på hva som er bra eller dårlig skikk.

Skal update førsteposten så snart koden er bedre formatert!

Lenke til kommentar

koden er oppdatert!

 

(Hmm, ser fin ut i eclipse, men her blir den jo rotete so fy..)

 

Syre indentert version:

public void AI(String text) {
// initiate new lists to be on the safe side
List<String> indexer = new ArrayList<String>();
List<String> sentence = new ArrayList<String>();
List<String>    explode = new ArrayList<String>();
List<String>    ary = new ArrayList<String>();
explode = Arrays.asList(text.split(" ")); 

 // initiate randint and trigger variable
 Random rand = new Random();
 int randint = rand.nextInt(explode.size());

// initiate the trigger variable
 String trigger = explode.get(randint);

  // check if word exists in database and add if it not.
for(int i = 0; i < explode.size(); i++) {
 String word = explode.get(i);

if(common.get(word)==null) {
				  words.add(word);
				  common.put(word, 1);
				  context.put(word, explode);
				  pos.put(word, i);
			   length.put(word, explode.size());

				   }else{
  // increase the weight of common if the word repeats
			    common.put(word, common.get(word)+1 );
						    }
						    }
  //check if context with index set as trigger is empty, if not, copy the arraylist to the ary variable
  if(!context.get(trigger).isEmpty()) {
   Collections.copy( ary, context.get(trigger));}


  // fill the arraylist sentence with words to be used, some in context, some random from the database.
for(int i2 = 0; i2 < length.get(trigger); i2++ ) {

			   randint = rand.nextInt(length.get(trigger));

if(randint < length.get(trigger)/2) {
								  //
								   if(ary.get(i2)!=null) {
															 sentence.add(ary.get(i2));
														    }
								 }else{
					 sentence.add(words.get(rand.nextInt(words.size())));
							    }

} 
   // use to the pos-hashmap to check at which index the word was detected at, if not place it at the deliberate index.
for(int i3 = 0; i3 < sentence.size(); i3++) {
										 if(sentence.get(i3)!=null) {
										 indexer.add(pos.get(sentence.get(i3)), sentence.get(i3));
																    }
									  }

// compose the final string that is to be passed to the speak function
for(int i4 = 0; i4 < indexer.size(); i4++) {
say = say + indexer.get(i4)+" ";
 }
// pass the string to the speak function
mTts.speak(say, TextToSpeech.QUEUE_FLUSH, null); 

   // removing final string to be ready for next iteration
 say = "";



// end of AI stuff  
}

Endret av Leif.ross
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...