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

πως μπορώ σε προγραμμα .java να επιστρέψω τιμή από τη main


dimitris_k

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

Καλησπέρα, ξέρει κανείς πως μπορώ να επιστρέψω κάποια τιμή από τη main; Έχω διαβάσει πως η main στη java δε μπορεί να επιστρέψει τιμές αλλά κάτι μπορεί να γίνει καλώντας την System.exit(). Θέλω να επιστρέψω είτε int είτε sting. Το πρόβλημά μου είναι ότι καλώ μέσω .sh προγράμματος ένα πρόγραμμα .java και θέλω το .java πρόγραμμα να μου επιστρέψει μία τιμή ώστε να αλλάξω το περιεχόμενο μίας μεταβλητής στο shell script. Μπορείτε να προτείνετε κάτι;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν μπορείς να επιστρέψεις String. Μόνο integer, και γίνεται όπως ακριβώς λές με την System.exit:

>
System.exit(1);

Αλλά θέλει προσοχή γιατί καλώντας αυτή την μέθοδο στην ουσία "σκοτώνεις" την Java virtual machine. Σαν να κάνεις shutdown το λειτουργικό σου σύστημα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εφόσων θέλεις string μπορείς να το κάνεις print στο stdout απο το java προγραμμα και να το πιάσεις απο το shell με τον standard τρόπο:

 

FOO=`java MyMainJavaClass`

 

if [ $FOO = 'whatever' ];

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εφόσων θέλεις string μπορείς να το κάνεις print στο stdout απο το java προγραμμα και να το πιάσεις απο το shell με τον standard τρόπο:

 

FOO=`java MyMainJavaClass`

 

if [ $FOO = 'whatever' ];

 

Πολύ καλύτερη λύση κατα την γνώμη μου!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλώ το πρόγραμμα .java μέσα από shell script με αυτή την εντολή

>accept=`java CheckName $fileName`

και έχω μέσα στο .java αυτό το κομμάτι κώδικα:

>if (accept == one)
{
    System.exit(1);
}
else
{
    System.exit(0);
}

Όπου accept και one είναι μεταβλητές τύπου int. Μέσα στο .java έχω και κάποια μηνύματα που εκτυπώνονται στην οθόνη με αποτέλεσμα να λαμβάνω αυτό το μήνυμα:

>execute.sh: line 4: [: the printed message: integer expression expected

η γραμμή 4 είναι:

>accept=`java CheckName $fileName`

 

Δοκίμασα να κάνω

>System.out.print("μήνυμα")

αλλά επειδή έχει και άλλες print το .java δημιουργείται πρόβλημα γιατί προσπαθεί να αποθηκεύσει όλα τα μηνύματα που εκτυπώνονται στην "accept"

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ε τότε αφού δεν μπορείς να κάνεις χωρίς την System.exit() τροποποίησε την 4 γραμμή ως εξής:

>
mycommand=`java CheckName $fileName`
accept=$?

 

δοκίμασε και το:

>
accept=`java CheckName $fileName | tail -1`

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

στο πρώτο

>       mycommand=`java CheckName $fileName`
       accept=$

μου βγάζει σφάλμα

>execute.sh: line 4: [: $: integer expression expected

και στο δεύτερο

>accept=`java CheckName $fileName` | tail -l

δεν βγαίνει ποτέ απο την επανάληψη

επίσης και στις δύο περιπτώσεις παραβλέπονται τα υπόλοιπα μηνύματα που θα έπρεπε να εκτυπώνονται

 

Σκέφτηκα να κάνω ανακατεύθυνση των αποτελεσμάτων του .java προγράμματος και να γράφονται σε ένα .txt αρχείο. Και μετά να διαβάσω το .txt αρχείο το οποίο και να εκτυπώσω την οθόνη χωρίς την τελευταία του γραμμή η οποία θα περιέχει την τιμή που θέλω να πάρει η "accept". Δεν ξέρω όμως πως να διαβάσω το αρχείο και να δώσω στην "accept" την τελευταία γραμμή του αρχείου σε bash shell script. Μπορεί κάποιος να με βοηθήσει με αύτο; Την ανακατελυθυνση την έκανα με αυτό τον τρόπο

>java CheckName $fileName>dokimi.txt

και δουλεύει σωστά.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γιατι το κάνεις δύσκολο, δεν χρειάζεται να ανακατευθύνεις την έξοδο του προγράμματος σε αρχείο. Πάρε ένα απλό παράδειγμα

 

>

/* Αρχείο Main.java */

class Main {
       public static void main(String args[]) {
               System.out.println("Foo at console");
       }
}

 

>

# Αρχείο main.sh

#!/bin/bash

java_bin="/usr/bin/java"
java_class="Main"

result=`$java_bin $java_class`

EXPECTED_OUT="Foo at console"

if [ "$result" == "$EXPECTED_OUT" ]
       then
               echo "Expected output cought"
       else
               echo "Output different than expected"
fi

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Διαβάζοντας το τελευταίο σχόλιο και τον κώδικα σκέφτηκα πως όντος κάνω τα πράγματα δύσκολα. Συνειδητοποίησα ότι όταν το .java πρόγραμμα επιστρέφει ότι η τιμή είναι αποδεκτή τότε έχω μόνο μία

>System.out.print()

οπότε μπορεί να δωθεί η τιμή αυτή στη μεταβλητή μου στο shell script και στον έλεγχο να συγκρίνω με την τιμή αυτή. Αντέστρεψα τη συνθήκη στον έλεγχο της επανάληψης και δούλεψε σωστά. Σας ευχαριστώ όλους πάρα πολύ. Για εμένα ήτανε ουσιαστική η βοήθειά σας. Αν κάποιος γνωρίζει πως από το shell script μπορώ να διαβάσω .txt αρχείο και να δώσω σε μεταβλητή την τιμή συγκεκριμένης σειράς τότε θα με ενδιέφερε να το μάθω. Δε μου χρειάζεται αυτή τη στιγμή αλλά θα ήθελα να ξέρω αν όντος γίνεται και πως. Και πάλι ευχαριστώ πολύ.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...