Leif.ross Skrevet 22. mai 2012 Del Skrevet 22. mai 2012 (endret) 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 25. mai 2012 av Leif.ross Lenke til kommentar
Hieronymus Skrevet 23. mai 2012 Del Skrevet 23. mai 2012 Djeezes! Lær deg indentering, navngivningsregler, og andre grunnleggende ting, så skal jeg kanskje titte på koden din. Lenke til kommentar
Matsemann Skrevet 24. mai 2012 Del Skrevet 24. mai 2012 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
Kiff Skrevet 25. mai 2012 Del Skrevet 25. mai 2012 Forum-editoren konverter tab til space i 1:1 forhold istedetfor 1:2 eller 1:4 som er mer vanlig. Lenke til kommentar
Leif.ross Skrevet 25. mai 2012 Forfatter Del Skrevet 25. mai 2012 (endret) 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! Men! Fant ut at problemet var at jeg satte INDEXER og Sentence til null i slutten av funksjonen, derfor så fikk jeg en nullpointerexception! 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 25. mai 2012 av Leif.ross Lenke til kommentar
Matsemann Skrevet 25. mai 2012 Del Skrevet 25. mai 2012 (endret) 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 25. mai 2012 av Matsemann Lenke til kommentar
Leif.ross Skrevet 25. mai 2012 Forfatter Del Skrevet 25. mai 2012 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
Leif.ross Skrevet 25. mai 2012 Forfatter Del Skrevet 25. mai 2012 (endret) 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 25. mai 2012 av Leif.ross Lenke til kommentar
LostOblivion Skrevet 2. juni 2012 Del Skrevet 2. juni 2012 Om du er ny til Java, kan du jo ta en titt her og der. http://www.oracle.com/technetwork/java/codeconv-138413.html (Sun's anbefalte kodestilkonvensjon.) https://sites.google.com/a/android.com/opensource/submit-patches/code-style-guide (Google's anbefalte kodestilkonvensjon.) Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå