Gå til innhold

Problemer med IOExeptiong og Runtime


Anbefalte innlegg

Som dere ser så skal dette programmet være et net send program. Ja jeg vet det finnes mange slike, men jeg lager det bare for å lære java koding :p

 

Anyways.. Problemet ligger i at IOExeption må kastes for at Runtime skal fungere, men KnappeLytter klarer tydelivis å oppdage at jeg har kastet IOExeption i main. Det fungerer heller ikke å kaste det i KnappeLytter fordi det må kastes i main (slik jeg har forstått det værtfall)

 

Hva kan jeg gjøre for å få Runtime til å fungere?

 

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;

class vindu1 extends JFrame {
private static final String standardtekst = "";
private JTextField mottakerFelt = new JTextField(15);
private JTextField antallGangerFelt = new JTextField(15);
private JTextArea tekstfelt = new JTextArea (10, 20);
private JButton sendknapp = new JButton("Send");
private JButton omknapp = new JButton("Om");

public vindu1(String tittel) {
 setTitle(tittel);
 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 getContentPane().setLayout(new BorderLayout(5,5));
 getContentPane().add(new MottakerPanel(), BorderLayout.NORTH);
 getContentPane().add(new TekstomraadePanel(), BorderLayout.CENTER);
 getContentPane().add(new KnappePanel(), BorderLayout.SOUTH);
 pack();
}

private class MottakerPanel extends JPanel {
 public MottakerPanel() {
 	setLayout(new GridLayout(2, 2, 5, 5));
 	add(new JLabel("Mottaker:", JLabel.RIGHT));
 	add(mottakerFelt);


 	add(new JLabel("Antall:", JLabel.RIGHT));
 	add(antallGangerFelt);
 }
}

private class TekstomraadePanel extends JPanel {
 public TekstomraadePanel() {
 	tekstfelt.setLineWrap(true);
 	tekstfelt.setWrapStyleWord(true);
 	tekstfelt.setEditable(true);
 	tekstfelt.setText(standardtekst);
 	JScrollPane rullefelt = new JScrollPane(tekstfelt);
 	add(rullefelt);
 }
}

private class KnappePanel extends JPanel {
 public KnappePanel() {
 	KnappeLytter knappelytteren = new KnappeLytter();
 	sendknapp.addActionListener(knappelytteren);
 	sendknapp.setEnabled(true);
 	sendknapp.setMnemonic('S');
 	add(sendknapp);
 	KnappeLytter1 omknapplytter = new KnappeLytter1();
 	omknapp.addActionListener(omknapplytter);
 	omknapp.setEnabled(true);
 	omknapp.setMnemonic('S');
 	add(omknapp);
 }
}
//Her ligger problemet. Når jeg skal kjøre cmd.exe så får jeg bare feilmelding i kompilator at IOExeption må kastes.
private class KnappeLytter implements ActionListener {
 public void actionPerformed(ActionEvent hendelse) {
 	String mottaker = mottakerFelt.getText();
 	// String antallGang = antallGang.getText();
 	String tekst = tekstfelt.getText();
 	Process proc = Runtime.getRuntime().exec("cmd /c net send " + mottaker + " " + tekst);
 }
}
private class KnappeLytter1 implements ActionListener {
 public void actionPerformed(ActionEvent om) {
 	JOptionPane.showMessageDialog(null, "Programmet er laget av:\n- phoen|x \n- ventreC ");
 }
}
}

class vindu {
public static void main(String[] args) throws IOException {
 vindu1 etVindu = new vindu1("Net send power");
 etVindu.setVisible(true);
}
}

Lenke til kommentar
Videoannonse
Annonse

Kan main kaste unntak? Det hørtes rart ut, spør du meg.

 

Prøv heller:

public static void main(String[] args) {
 try {
    vindu1 etVindu = new Vindu1("Net send power");
    etVindu.setVisible(true);
 } catch (IOException e) {
     System..out.println(e);
 }
}

 

Nå leste jeg ikke hele programmet ditt, men jeg skjønner ikke hvordan main kan kaste unntak. Hvordan skulle det evt fanges?

Lenke til kommentar

Som du ser her så kastes IOException i main

 

import java.io.*;
import javax.swing.JOptionPane;
public class Example {
public static void main (String[]args) throws IOException {
 String mottakLest = JOptionPane.showInputDialog ("Mottaker");
 String tekstLest = JOptionPane.showInputDialog ("Tekst");
 Process proc = Runtime.getRuntime().exec("cmd /c net send " + mottakLest + " " + tekstLest);
 System.exit(0);
}
}

 

For at du skal slippe å lese hele programmet så kan jeg forklare hva det skal gjøre. Et vindu med 3 ruter i kommer opp. En hvor du skriver mottaker, en med hvor mange ganger meldingen skal sendes og en med selve teksten. Send knappen skal starte cmd.exe og skrive "net send + mottaker + tekst"

Lenke til kommentar

Hvis du ønsker at main() skal stoppe når noe skjer må du stoppe programmet manuelt:

 

try{
   Process proc = Runtime.getRuntime().exec("cmd /c net send " + mottaker + " " + tekst);
}
catch(IOException e) {
   System.out.println("Kunne ikke sende melding, avslutter...");
   System.exit(-1);
}

 

Grunnen til det er at koden som kjøres når en 'event' trigges kalles ikke av main(), men av en eller annen tråd i JVM'et, følgelig ligger ikke main() på stacken under tråden og kan heller ikke fange opp Exception som den kaster. For at du skal kunne kaste et Exception til en metode må de ligge rett over/under hverandre.

Lenke til kommentar
  • 2 uker senere...

Er vell mulig å lage en klasse som arver fra ThreadGroup der man lager sin egen variant av uncaughtException. Da vill det være mulig å fange opp unntak i andre tråder.

 

Er nok ikke en løsning trådstarter bør bruke i dette tilfellet. Tenkte bare jeg skulle informere om at det lar seg gjøre. Har ikke testet dette selv, men på papiret ser det ut som om det skal fungere ganske greit.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...