Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Έχω κάνει την παρακάτω εφαρμογή και την τρέχω απο το emulator του ADT bundle.

 

i471.png

 

Της έχω δώσει μια if για να εμφανίζει ένα μήνυμα Τoast όταν δεν δίνεις τιμές και πατάς το run. Ένα που λέει fill all fields και ένα ακόμα Give correct numbers...

 

if((str_genome.length() <= 0) | (str_generations.length() <= 0))
{
Toast.makeText(getApplicationContext(), getString(R.string.fill_fields), Toast.LENGTH_SHORT).show();
}
else if ((Integer.parseInt(str_genome) <= 1) | (Integer.parseInt(str_generations) <= 0))
{
Toast.makeText(getApplicationContext(), getString(R.string.correct_numbers), Toast.LENGTH_SHORT).show();
}

Το πρόβλημα είναι ότι όταν δεν δίνω τιμές και πατάω το RUN θα έπρεπε να εμφανίζει τα μηνύματα Toast. Αντι αυτού τερματίζει με το μήνυμα  Unfortunately (App name) has stopped.

Ακόμα πιο περίεργο είναι ότι όταν το ολοκλήρωσα δούλευε μια χαρά. Τώρα που το ξαναδοκίμασα μου κάνει αυτά. Γνωρίζει κανείς? 

 

Η αναφορά του logCat είναι αυτή.

 

  Εμφάνιση κρυμμένου περιεχομένου

  • Moderators
Δημοσ.

Για αρχή τα "or" που έχεις στα if clauses στον κώδικά σου δείχνουν λάθος. Θέλεις ||, κι όχι μονό |. Εκτός και αν είναι είναι λάθος μόνο όταν μετέφερες εδώ τον κώδικα.

  • Like 1
Δημοσ.

Όπως είπε ο Praetorian τσέκαρε τα | (θα πρέπει να είναι ||). Από εκεί και πέρα η εξαίρεση που οδηγεί σε διακοπή το πρόγραμμα είναι η NumberFormatException που σημαίνει ότι η είσοδος της parseInt περιέχει μη αριθμητικούς χαρακτήρες οπότε θα πρέπει να διαχειριστής και αυτή την περίπτωση (πχ. μέσω try & catch).

  • Like 1
Δημοσ.

Δοκίμασα το διπλό or.. Δεν πέτυχε. 

 

  Στις 19/10/2013 στις 6:07 ΠΜ, Directx είπε

Όπως είπε ο Praetorian τσέκαρε τα | (θα πρέπει να είναι ||). Από εκεί και πέρα η εξαίρεση που οδηγεί σε διακοπή το πρόγραμμα είναι η NumberFormatException που σημαίνει ότι η είσοδος της parseInt περιέχει μη αριθμητικούς χαρακτήρες οπότε θα πρέπει να διαχειριστής και αυτή την περίπτωση (πχ. μέσω try & catch).

Μάλλον έχεις δίκιο.

 

Στην πρωτότυπη εργασία που αντέγραψα τον κώδικα είχε και αυτά:

 

  Εμφάνιση κρυμμένου περιεχομένου

 

 

Έχουν καμία σχέση αυτά με τα Toast?

  • Moderators
Δημοσ.

Αν και ο μονός τελεστής | (bitwise or) δουλεύει στην περίπτωσή σου, ο "σωστός" τελεστής για αυτό που κάνει ο κώδικας είναι το λογικό or ||.

Επιπλέον ο bitwise or που έχεις σημαίνει ότι το if clause θα κάνει evaluate όλα τα επιμέρους clauses για να αποφασίσει αν είναι true ή false, ενώ ο λογικός τελεστής θα έκανε evaluate μόνο όσα χρειάζεται για να αποφασίσει (short circuit).

 

Πέρα από αυτό (που είναι περισσότερο τυπικό θέμα) ο κώδικάς σου crash-αρει στο δεύτερο clause. Αν βάλεις τα try/catch που λέει ο DirectX θα γλιτώσεις το crash από το exception, αλλά το λάθος τουλάχιστον όπως το καταλαβαίνω είναι ότι με κενά πεδία ο κώδικάς σου δεν θα έπρεπε καν να φτάσει στο else if clause (θα έπρεπε το πρώτο if να είναι true). Οπότε κάτι κάνεις λάθος στον υπολογισμό των κενών πεδίων. Τι ακριβώς είναι τα str_genome και str_generations? Τι τύπο έχουν;

Δημοσ.

εγώ θα το έγραφα έτσι

επίσης δεν χρειάζεται getstring μέσα στο toast

if(str_genome.length() <= 0) || (str_generations.length() <= 0 )
{
Toast.makeText(getApplicationContext(), R.string.fill_fields, Toast.LENGTH_SHORT).show();
}
else {
try{
 
geno=Integer.parseInt(str_genome)
gene=Integer.parseInt(str_generations) 
}
catch(NumberFormatException ex) {
Toast.makeText(getApplicationContext(), R.string.correct_numbers , Toast.LENGTH_SHORT).show();
}
}
Δημοσ.
  Στις 22/10/2013 στις 12:46 ΜΜ, Mr.Etherium είπε

Δοκίμασα το διπλό or.. Δεν πέτυχε. 

 

Μάλλον έχεις δίκιο.

 

Στην πρωτότυπη εργασία που αντέγραψα τον κώδικα είχε και αυτά:

 

  Εμφάνιση κρυμμένου περιεχομένου

 

 

Έχουν καμία σχέση αυτά με τα Toast?

 

Με μια γρήγορη ματιά δεν νομίζω.

 

Επίσης μην ξεχνάς ότι το LogCat σου δίνει ακριβώς την γραμμή / κλήση που προξένησε το exception σου:

  Αναφορά σε κείμενο

10-19 01:33:48.988: E/AndroidRuntime(818): at com.example.geneticalgorithm.MainActivity$2.onClick(MainActivity.java:226)

Οπότε αρκεί να ρίξεις μια ματιά στην γραμμή 226 του MainActivity.java.

Δημοσ.
  Στις 22/10/2013 στις 1:44 ΜΜ, warlock9_0 είπε

 

εγώ θα το έγραφα έτσι

επίσης δεν χρειάζεται getstring μέσα στο toast

 

 

  Εμφάνιση κρυμμένου περιεχομένου

 

Δίνει αυτό το error... Syntax error on token "||", invalid OnlySynchronized

 

  Στις 22/10/2013 στις 1:28 ΜΜ, Praetorian είπε

Τι ακριβώς είναι τα str_genome και str_generations? Τι τύπο έχουν;

Είναι String

String str_genome = et_chromosomes.getText().toString();
String str_generations = et_generations.getText().toString();

 

  Στις 22/10/2013 στις 6:44 ΜΜ, Directx είπε

Οπότε αρκεί να ρίξεις μια ματιά στην γραμμή 226 του MainActivity.java.

Σε αυτή τη γραμμή έχω αυτά:

genome_count = Integer.parseInt( et_chromosomes.getText().toString());
maxgenerations = Integer.parseInt( et_generations.getText().toString());
 
τώρα δοκίμασα να δώσω μια αρχική τιμή 0 στα:
int genome_count = 0;
int maxgenerations = 0;
 
τίποτα.
  • Moderators
Δημοσ.
  Στις 22/10/2013 στις 8:51 ΜΜ, Mr.Etherium είπε

Δίνει αυτό το error... Syntax error on token "||", invalid OnlySynchronized

Στον κώδικα που παραθέτει ο warlock, το if clause θέλει και εξωτερικές παρενθέσεις (βασικά χρειάζεται μόνο τις εξωτερικές παρενθέσεις)

if((str_genome.length() <= 0) || (str_generations.length() <= 0 ))
{
...
}
 

 

  Αναφορά σε κείμενο

Σε αυτή τη γραμμή έχω αυτά:

genome_count = Integer.parseInt( et_chromosomes.getText().toString());

maxgenerations = Integer.parseInt( et_generations.getText().toString());

Σε αυτά γιατί δεν έχεις κάποιον έλεγχο αν είναι όντως numeric και μη-κενό το string ή εναλλακτικά ένα try/catch στην περίπτωση που δεν είναι;
  • Like 1
Δημοσ.
  Στις 22/10/2013 στις 9:14 ΜΜ, Praetorian είπε
if((str_genome.length() <= 0) || (str_generations.length() <= 0 ))
{
...
}
 

 

Σε αυτά γιατί δεν έχεις κάποιον έλεγχο αν είναι όντως numeric και μη-κενό το string ή εναλλακτικά ένα try/catch στην περίπτωση που δεν είναι;

 

Δεν έχω ιδέα... Πάντως πιστεύω πως αυτό γίνετε (διορθώστε με) επειδή ΔΕΝ δίνω καμία τιμή στα πεδία και αυτό περιμένει να δει κάποιον αριθμό int. Και αφού δεν βλέπει κρασάρει. 

Δημοσ.
  Στις 22/10/2013 στις 8:51 ΜΜ, Mr.Etherium είπε

Σε αυτή τη γραμμή έχω αυτά:

genome_count = Integer.parseInt( et_chromosomes.getText().toString());

maxgenerations = Integer.parseInt( et_generations.getText().toString());

 

τώρα δοκίμασα να δώσω μια αρχική τιμή 0 στα:

int genome_count = 0;

int maxgenerations = 0;

 

τίποτα.

Ποίος ο λόγος να κάνεις αρχικοποίηση τιμών; Αυτό που θα μπορούσες να κάνεις είναι να ελέγχεις αν η είσοδος σου είναι καταρχήν κάποια αριθμητική τιμή και ύστερα αν αυτή η αριθμητική τιμή εμπίπτει στα επιθυμητά όρια. Αν ναι τότε συνεχίζεις την εκτέλεση του κώδικα σου διαφορετικά διακόπτεις με exception.

 

Για παράδειγμα:

                String str_genome = "a",
		       str_generations = "2";
				
		try
		{
			/* έλεγχος εισόδου */
			int genome_cout = Integer.parseInt(str_genome),
				maxgenerations = Integer.parseInt(str_generations);
			
			if(genome_cout <= 0 || maxgenerations <= 0)
				throw new NumberFormatException();
			
			/* υπόλοιπο πρόγραμμα.. */
			Toast.makeText(this, "...", Toast.LENGTH_SHORT).show();
		}
		catch(NumberFormatException e)
		{
			Toast.makeText(this, "Bad input!", Toast.LENGTH_SHORT).show();			
		}
Καλή συνέχεια.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...