# java.exe beendet nicht nach ausführen von .jar



## Iglo (20. Aug 2008)

Hallo!
Ich bin neu hier hab aber eine Frage die mich schon ein paar Tage beschäftigt und auf die mir bis jetzt noch keiner eine antwort geben konnte...  :bahnhof: 

Ich habe ein kleines Programm geschrieben das mithilfe von javax.comm.* über den Seriellen Port auf ein Nokia 30 Modem zugreift. An dieses werden mithilfe von Outputstreams Befehle gesendet. Das funktioniert auch alles sehr gut.

Nach Programmende läuft aber der Prozess "java.exe" weiter. Um mein Problem zu beheben muss dieser aber unbedingt geschlossen werden weil sonst das Programm das die .jar Datei aufruft sonst nicht weiterarbeitet bzw. ein timeout bekommt.

Ich rufe die .jar datei über eine .bat Datei auf (java -jar "SMSAlert.jar").  :wink:

Bitte helft mir das java.exe wegzumachen 


Hier der Source Code:



```
package smsalert;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.comm.CommDriver;
import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.UnsupportedCommOperationException;

/**
 * @author Thomas Welspacher 2008
 * @version 1.0
 * Contact: [email]kaeptn.iglo@hotmail.com[/email]
 */
public class Main {

    private static String nl = "\r\n";
    private static String cmgf = "AT+CMGF=1";
    private static String csca = "AT+CSCA=\"+436640501\",145";
    private static String cpinready = "AT+CPIN?";

    public static void main(String[] args) throws IOException {
        try {
            SerialPort port = null;
            try {
                System.setSecurityManager(null);
                String wantedPortName = "COM1";

                //Treiber initialisieren
                try {
                    String driverName = "com.sun.comm.Win32Driver"; //
                    CommDriver commDriver = (CommDriver) Class.forName(driverName).newInstance();
                    commDriver.initialize();
                } catch (ClassNotFoundException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                } catch (InstantiationException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                } catch (IllegalAccessException ex) {
                    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                }
                Enumeration portIdentifiers = CommPortIdentifier.getPortIdentifiers();
                CommPortIdentifier portId = null; // wird gesendet wenn port gefunden

                //Seriellen Port finden
                while (portIdentifiers.hasMoreElements()) {
                    CommPortIdentifier pid = (CommPortIdentifier) portIdentifiers.nextElement();
                    if (pid.getPortType() == CommPortIdentifier.PORT_SERIAL && pid.getName().equals(wantedPortName)) {
                        portId = pid;
                        break;
                    }
                }
                if (portId == null) {
                    System.err.println("Kann den Seriellen Port nicht finden " + wantedPortName);
                    System.exit(1);
                }
                System.out.println("\nSerieller Port " + wantedPortName + " gefunden!");

                //Port öffnen
                try {
                    port = (SerialPort) portId.open(
                            "SMS Alert", // Name der Applikation die den Port Benutzt
                            10000 // timeout von 10 Sekunden
                            );
                    System.out.println("Serieller Port " + wantedPortName + " wurde geoeffnet!");
                } catch (PortInUseException e) {
                    System.err.println("Port wird bereits benutzt von: " + e);
                    System.exit(1);
                }

                //Seriellen Port initialisieren
                port.setSerialPortParams(115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            } catch (UnsupportedCommOperationException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }

            //In und Output Streams erzeugen
            BufferedReader is = null; //auch mit Stream möglich
            PrintStream os = null;
            try {
                is = new BufferedReader(new InputStreamReader(port.getInputStream()));
            } catch (IOException e) {
                System.err.println("Konnte Input Stream nicht oeffnen. Nur schreiben moeglich!");
                is = null;
            }

            os = new PrintStream(port.getOutputStream(), true, "ISO-8859-1");
            OutputStream ostr = port.getOutputStream();
            System.out.println("Input und Output Stream geoeffnet!\n");

            //Pincode aus pin.txt importieren und zusammenfügen
            DataInputStream pinInput = new DataInputStream(new FileInputStream("pin.txt"));
            BufferedReader pinReader = new BufferedReader(new InputStreamReader(pinInput));
            String code = pinReader.readLine();
            String pin = "AT+CPIN=\"" + code + "\"";

            //Abfragen ob PIN Code bereits eingegeben ist (AT+CPIN?)
            String pinCheck, pinCheckOK;
            ostr.write(cpinready.getBytes());
            Thread.sleep(250);
            ostr.write(nl.getBytes());
            Thread.sleep(250);
            ostr.flush();

            System.out.println("Echo " + is.readLine());
            is.readLine();//Steuerzeichen lesen; werden nicht ausgegeben
            pinCheck = is.readLine();
            is.readLine();//Steuerzeichen lesen; werden nicht ausgegeben
            pinCheckOK = is.readLine();

            System.out.println("Response " + pinCheck);
            System.out.println("Response " + pinCheckOK + "\n");

            if (pinCheck.equals("+CPIN: SIM PIN") && pinCheckOK.equals("OK")) {
                //PIN Code Eingabe (AT+CPIN="code")
                ostr.write(pin.getBytes());
                Thread.sleep(250);
                ostr.write(nl.getBytes());
                Thread.sleep(250);
                ostr.flush();

                System.out.println("Echo " + is.readLine());
                is.readLine();//Steuerzeichen lesen; werden nicht ausgegeben
                System.out.println("Response " + is.readLine() + "\n");
            }

            //Text Modus setzen (AT+CMGF=1)
            ostr.write(cmgf.getBytes());
            Thread.sleep(250);
            ostr.write(nl.getBytes());
            Thread.sleep(250);
            ostr.flush();

            System.out.println("Echo " + is.readLine());
            is.readLine();//Steuerzeichen lesen; werden nicht ausgegeben
            System.out.println("Response " + is.readLine() + "\n");

            //Nummer der Kurzmitteilungszentrale setzen (AT+CSCA="+436640501",145) Nummer=A1 145=Nummer beginnt mit + 129= Nummer beginnt mit Ziffer
            ostr.write(csca.getBytes());
            Thread.sleep(250);
            ostr.write(nl.getBytes());
            Thread.sleep(250);
            ostr.flush();

            System.out.println("Echo " + is.readLine());
            is.readLine();//Steuerzeichen lesen; werden nicht ausgegeben
            System.out.println("Response " + is.readLine() + "\n");

            //Nummern und Nachricht Importieren (numbers.txt bzw. message.txt)
            DataInputStream numberInput = new DataInputStream(new FileInputStream("numbers.txt"));
            BufferedReader numberReader = new BufferedReader(new InputStreamReader(numberInput));
            ArrayList<String> numberList = new ArrayList<String>();
            String numb = null;

            DataInputStream messageInput = new DataInputStream(new FileInputStream("message.txt"));
            BufferedReader messageReader = new BufferedReader(new InputStreamReader(messageInput));
            String alertMessage = messageReader.readLine();

            while ((numb = numberReader.readLine()) != null) {
                numberList.add(numb);
            }

            //Wenn Nummer und Nachricht vorhanden:
            if (alertMessage != null) {
                System.out.println("Nachricht: " + alertMessage);
                if (numberList.isEmpty() == true) {
                    System.out.println("Keine Empfaenger in numbers.txt eingetragen!\n");
                } else {
                    System.out.println("Nachricht wird gesendet an:\n");
                    for (int j = 0; j < numberList.size(); j++) {
                        System.out.println(numberList.get(j).toString());
                        System.out.println("");
                    }

                    //Nummern Eingabe + senden der Nachricht
                    for (int i = 0; i < numberList.size(); i++) {
                        String cmgs1 = "AT" + "+" + "CMGS=\"" + numberList.get(i) + "\"\r";
                        String cmgs2 = alertMessage + "\032";

                        ostr.write(cmgs1.getBytes());
                        Thread.sleep(250);
                        ostr.write(cmgs2.getBytes());
                        Thread.sleep(250);
                        ostr.flush();

                        //Sendevorgang
                        String sendLine1, sendLine2, sendLine3, sendLine4;

                        sendLine1 = is.readLine();
                        is.readLine();//Steuerzeichen lesen; werden nicht ausgegeben
                        sendLine2 = is.readLine();
                        sendLine3 = is.readLine();
                        is.readLine();//Steuerzeichen lesen; werden nicht ausgegeben
                        sendLine4 = is.readLine();

                        System.out.println("Echo " + sendLine1);
                        System.out.println("Response " + sendLine2);
                        System.out.println("Response " + sendLine3);
                        System.out.println("Response " + sendLine4);
                    }

                }
            } else {
                System.out.println("Kein Nachrichteninhalt in message.txt!\n");
            }

            //Schließen von Streams und Port
            if (is != null) {
                is.close();
                numberInput.close();
                numberReader.close();
                messageInput.close();
                messageReader.close();
                pinInput.close();
                pinReader.close();
                System.out.println("\nInput Streams geschlossen!");
            }
            if (os != null) {
                os.close();
                ostr.close();
                System.out.println("Output Streams geschlossen!");
            }
            if (port != null) {
                port.close();
                System.out.println("Serial Port geschlossen!\n");
            }
        } catch (InterruptedException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.exit(0);
    }
}
```

Danke schonmal im voraus 
mfg Iglo


----------



## pc-world (23. Aug 2008)

Unsauberer Ausweg:
Programm mit 
	
	
	
	





```
System.exit(0);
```
 gewaltsam beenden.


----------



## igloo (26. Aug 2008)

dann sag mir doch nen sauberen...  :gaen:


----------



## FArt (2. Sep 2008)

Was läuft noch, dass sich das Programm nicht beendet? Lass dir mal einen Thread-Dump ausgeben und stelle das ab.

Allgemein gehst du hier sehr unsauber mit Ressourcen (Streams) um. In Fehlerfällen werden nicht alle sauber geschlossen.


----------



## burnner (10. Sep 2008)

system.exit(0) ist meiner meinung nach total überflüssig? mach das mal weg dann sollte es eigentlich funktionieren


----------

