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

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

Δημοσ.

Έχω κάνει την παρακάτω εφαρμογή και την τρέχω απο το 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 είναι αυτή.

 

 

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
Δημοσ.

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

  • Like 1
Δημοσ.

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

  • Like 1
Δημοσ.

Δοκίμασα το διπλό 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
Δημοσ.

Αν και ο μονός τελεστής | (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();
}
}
Δημοσ.

Δοκίμασα το διπλό 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.

Δημοσ.

 

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

επίσης δεν χρειάζεται 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
Δημοσ.

Δίνει αυτό το 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
Δημοσ.
if((str_genome.length() <= 0) || (str_generations.length() <= 0 ))
{
...
}
 

 

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

 

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

Δημοσ.

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

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();			
		}
Καλή συνέχεια.

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

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

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

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

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

Σύνδεση

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

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