Mr.Etherium Δημοσ. 19 Οκτωβρίου 2013 Δημοσ. 19 Οκτωβρίου 2013 Έχω κάνει την παρακάτω εφαρμογή και την τρέχω απο το emulator του ADT bundle. Της έχω δώσει μια 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 είναι αυτή. 10-19 01:33:48.988: E/AndroidRuntime(818): FATAL EXCEPTION: main 10-19 01:33:48.988: E/AndroidRuntime(818): java.lang.NumberFormatException: Invalid int: "" 10-19 01:33:48.988: E/AndroidRuntime(818): at java.lang.Integer.invalidInt(Integer.java:138) 10-19 01:33:48.988: E/AndroidRuntime(818): at java.lang.Integer.parseInt(Integer.java:359) 10-19 01:33:48.988: E/AndroidRuntime(818): at java.lang.Integer.parseInt(Integer.java:332) 10-19 01:33:48.988: E/AndroidRuntime(818): at com.example.geneticalgorithm.MainActivity$2.onClick(MainActivity.java:226) 10-19 01:33:48.988: E/AndroidRuntime(818): at android.view.View.performClick(View.java:4204) 10-19 01:33:48.988: E/AndroidRuntime(818): at android.view.View$PerformClick.run(View.java:17355) 10-19 01:33:48.988: E/AndroidRuntime(818): at android.os.Handler.handleCallback(Handler.java:725) 10-19 01:33:48.988: E/AndroidRuntime(818): at android.os.Handler.dispatchMessage(Handler.java:92) 10-19 01:33:48.988: E/AndroidRuntime(818): at android.os.Looper.loop(Looper.java:137) 10-19 01:33:48.988: E/AndroidRuntime(818): at android.app.ActivityThread.main(ActivityThread.java:5041) 10-19 01:33:48.988: E/AndroidRuntime(818): at java.lang.reflect.Method.invokeNative(Native Method) 10-19 01:33:48.988: E/AndroidRuntime(818): at java.lang.reflect.Method.invoke(Method.java:511) 10-19 01:33:48.988: E/AndroidRuntime(818): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 10-19 01:33:48.988: E/AndroidRuntime(818): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 10-19 01:33:48.988: E/AndroidRuntime(818): at dalvik.system.NativeStart.main(Native Method)
Moderators Praetorian Δημοσ. 19 Οκτωβρίου 2013 Moderators Δημοσ. 19 Οκτωβρίου 2013 Για αρχή τα "or" που έχεις στα if clauses στον κώδικά σου δείχνουν λάθος. Θέλεις ||, κι όχι μονό |. Εκτός και αν είναι είναι λάθος μόνο όταν μετέφερες εδώ τον κώδικα. 1
Directx Δημοσ. 19 Οκτωβρίου 2013 Δημοσ. 19 Οκτωβρίου 2013 Όπως είπε ο Praetorian τσέκαρε τα | (θα πρέπει να είναι ||). Από εκεί και πέρα η εξαίρεση που οδηγεί σε διακοπή το πρόγραμμα είναι η NumberFormatException που σημαίνει ότι η είσοδος της parseInt περιέχει μη αριθμητικούς χαρακτήρες οπότε θα πρέπει να διαχειριστής και αυτή την περίπτωση (πχ. μέσω try & catch). 1
Mr.Etherium Δημοσ. 22 Οκτωβρίου 2013 Μέλος Δημοσ. 22 Οκτωβρίου 2013 Δοκίμασα το διπλό or.. Δεν πέτυχε. Όπως είπε ο Praetorian τσέκαρε τα | (θα πρέπει να είναι ||). Από εκεί και πέρα η εξαίρεση που οδηγεί σε διακοπή το πρόγραμμα είναι η NumberFormatException που σημαίνει ότι η είσοδος της parseInt περιέχει μη αριθμητικούς χαρακτήρες οπότε θα πρέπει να διαχειριστής και αυτή την περίπτωση (πχ. μέσω try & catch). Μάλλον έχεις δίκιο. Στην πρωτότυπη εργασία που αντέγραψα τον κώδικα είχε και αυτά: try { AssetManager manager = getAssets(); InputStream in = null; InputStream in2 = null; String fileselected = spinner_data.getSelectedItem().toString(); //Open train file in = manager.open(fileselected); InputStreamReader inputStreamReader = new InputStreamReader(in); BufferedReader br = new BufferedReader(inputStreamReader); InputStreamReader inputStreamReader2 = new InputStreamReader(in2); BufferedReader br2 = new BufferedReader(inputStreamReader2); inputStreamReader.close(); inputStreamReader2.close(); } catch (IOException e) { Toast.makeText(getApplicationContext(), getString(R.string.file_error), Toast.LENGTH_SHORT).show(); e.printStackTrace(); } Έχουν καμία σχέση αυτά με τα Toast?
Moderators Praetorian Δημοσ. 22 Οκτωβρίου 2013 Moderators Δημοσ. 22 Οκτωβρίου 2013 Αν και ο μονός τελεστής | (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? Τι τύπο έχουν;
warlock9_0 Δημοσ. 22 Οκτωβρίου 2013 Δημοσ. 22 Οκτωβρίου 2013 εγώ θα το έγραφα έτσι επίσης δεν χρειάζεται 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(); } }
Directx Δημοσ. 22 Οκτωβρίου 2013 Δημοσ. 22 Οκτωβρίου 2013 Δοκίμασα το διπλό or.. Δεν πέτυχε. Μάλλον έχεις δίκιο. Στην πρωτότυπη εργασία που αντέγραψα τον κώδικα είχε και αυτά: try { AssetManager manager = getAssets(); InputStream in = null; InputStream in2 = null; String fileselected = spinner_data.getSelectedItem().toString(); //Open train file in = manager.open(fileselected); InputStreamReader inputStreamReader = new InputStreamReader(in); BufferedReader br = new BufferedReader(inputStreamReader); InputStreamReader inputStreamReader2 = new InputStreamReader(in2); BufferedReader br2 = new BufferedReader(inputStreamReader2); inputStreamReader.close(); inputStreamReader2.close(); } catch (IOException e) { Toast.makeText(getApplicationContext(), getString(R.string.file_error), Toast.LENGTH_SHORT).show(); e.printStackTrace(); } Έχουν καμία σχέση αυτά με τα 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.
Mr.Etherium Δημοσ. 22 Οκτωβρίου 2013 Μέλος Δημοσ. 22 Οκτωβρίου 2013 εγώ θα το έγραφα έτσι επίσης δεν χρειάζεται 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(); } } Δίνει αυτό το error... Syntax error on token "||", invalid OnlySynchronized Τι ακριβώς είναι τα str_genome και str_generations? Τι τύπο έχουν; Είναι String String str_genome = et_chromosomes.getText().toString(); String str_generations = et_generations.getText().toString(); Οπότε αρκεί να ρίξεις μια ματιά στην γραμμή 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 Praetorian Δημοσ. 23 Οκτωβρίου 2013 Moderators Δημοσ. 23 Οκτωβρίου 2013 Δίνει αυτό το 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 στην περίπτωση που δεν είναι; 1
Mr.Etherium Δημοσ. 23 Οκτωβρίου 2013 Μέλος Δημοσ. 23 Οκτωβρίου 2013 if((str_genome.length() <= 0) || (str_generations.length() <= 0 )) { ... } Σε αυτά γιατί δεν έχεις κάποιον έλεγχο αν είναι όντως numeric και μη-κενό το string ή εναλλακτικά ένα try/catch στην περίπτωση που δεν είναι; Δεν έχω ιδέα... Πάντως πιστεύω πως αυτό γίνετε (διορθώστε με) επειδή ΔΕΝ δίνω καμία τιμή στα πεδία και αυτό περιμένει να δει κάποιον αριθμό int. Και αφού δεν βλέπει κρασάρει.
Directx Δημοσ. 23 Οκτωβρίου 2013 Δημοσ. 23 Οκτωβρίου 2013 Σε αυτή τη γραμμή έχω αυτά: 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(); } Καλή συνέχεια.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα