Autor Thema: While-Schleife -> Programm Absturz  (Gelesen 556 mal)

Bobo

  • Neuling
  • *
  • Beiträge: 8
  • Karma: 0
    • Profil anzeigen
While-Schleife -> Programm Absturz
« am: 03. Januar 2017, 23:23:00 »
Hi, ich muss dieses Spiel bis Montag fertig bekommen und hab keine Ahnung wie ich umgehe, dass die While-Schleife, die ich brauche damit die Karten-Werte geschickt werden, mein Programm nicht zum Abstürzen bringt. Könnt ihr mal drüber schauen und mir helfen?

import java.awt.*;
import javax.swing.*;
public class StartSpiel { 
  public static void main(String[] args) {
    Menue m = new Menue();
    m.setVisible(true);
    m.setSize(800, 600);
    m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    m.setLocationRelativeTo(null);
    m.setTitle("FightCard");
    m.setResizable(false);
    m.add(new Menue());
   
    //SpielText st = new SpielText();
  } // end of main
} // end of class StartSpiel

import java.awt.*;
//import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.event.*;
import javax.swing.*;
public class Menue extends JFrame{
  //JLabel
  JLabel titel;
 
  //JButton
  JButton start;
  JButton credits;
  JButton anleitung;
 
 
  //JTextField
  JTextField ip;
  JTextField port;
  JTextField username;
 
  //int
  private int portnummer;
 
  //String
  private String ipAddresse;
  private String user;
 
 
  //Bilder
  //private BufferedImage background;
 
  public Menue() {
    //Fensteroptionen
    super("FightCard");
    setLayout(null);
   
    //Titel (JLabel)
    titel = new JLabel("Anime Fight Card Battle");
    Font schriftTitel = (titel.getFont().deriveFont(Font.BOLD, 50));
    titel.setFont(schriftTitel);
    titel.setBounds(0,0,600,100);
    add(titel);
   
    //Titelbild
    //background = Bilder.background;
   
    //Start (Button) --> neues JFrame aufrufen
    start = new JButton("Start");
    start.addActionListener(new StartListener());
    start.setBounds(0,100,100,50);
    add(start);
   
    //Anleitung (Button)
    anleitung = new JButton("Anleitung");
    anleitung.addActionListener(new StartListener());
    anleitung.setBounds(100,100,100,50);
    add(anleitung);
   
    //Credits (Button)
    credits = new JButton("Credits");
    credits.addActionListener(new StartListener());
    credits.setBounds(200,100,100,50);
    add(credits);
   
    //ip TextFeld
    ip = new JTextField();
    ip.setBounds(300,100,150,50);
    add(ip);
    ip.setText("127.0.0.1");
   
    //port TextFeld
    port = new JTextField();
    port.setBounds(450,100,150,50);
    add(port);
    port.setText("10000");
   
    //username TextFeld
    username = new JTextField();
    username.setBounds(600,100,150,50);
    add(username);
    username.setText("Username");
   
   
  }

  private class StartListener implements ActionListener{
    private int portnummer;
    private String ipAddresse;
    private String user;
   
    public void actionPerformed (ActionEvent e){
      if (e.getSource() == start) {
        JFrame sf = new SpielFrame();
       
        sf.setVisible(true);
        sf.setSize(1000, 1000);
        sf.setLocationRelativeTo(null);
        sf.setTitle("FightCard start");
        sf.setResizable(false);
       
        SpielFrame spiel = new SpielFrame();
       
        this.portnummer = Integer.parseInt(port.getText());       //Umwandlung von String in int!!!!!!
        this.ipAddresse = ip.getText();
       
        MultithreadedClient client = new MultithreadedClient(ipAddresse, portnummer, user, spiel.getKartenwert(), spiel.getGeklickt());
        //ClientTest client = new ClientTest();
       
       
        this.user = username.getText();
       
        client.start();
        //client.warte();
       
       
        //        System.out.println("Menü: "+ipAddresse);
        //        System.out.println("Menü: "+portnummer);
        //        System.out.println("Menü: "+User);
       
       
       
      } // end of if
     
      if (e.getSource() == credits) {
        JFrame cr = new Credits();
       
        cr.setVisible(true);
        cr.setSize(800, 600);
        cr.setLocationRelativeTo(null);
        cr.setTitle("FightCard Credits");
        cr.setResizable(false);
      } // end of if
    }
  }
 
  public int getPortnummer() {
   
    return this.portnummer;
  }
 
  public String getIpAddresse() {
   
    return this.ipAddresse;
  }
 
  public String getUsername() {
   
    return this.user;
  }
} // end of class Menue

import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.image.BufferedImage;
import java.awt.event.*;
import java.awt.Graphics;

public class SpielFrame extends JFrame{
  //Icon
  Icon bild1;
  Icon bild2;
  Icon bild3;
  Icon bild4;
  Icon bild5;
  Icon bild6;
  Icon bild7;
  Icon bild8;
  Icon bild9;
  Icon bild10;
  Icon bild11;
 
  //JButton
  JButton [] card = new JButton[10];
 
  //JLabel
  JLabel [] hinten = new JLabel[10];
 
  //String
  String wert = "";
 
  //int
  int gegnerWert;
 
  //Boolean
  boolean geklickt = false;

  public SpielFrame() {
    //SpielFrame
    super("FightCard start");
    setLayout(new GridLayout(4,0));
   
    //Bilder
    bild1 = new ImageIcon(getClass().getResource("Naruto.png"));   //1   
    bild2 = new ImageIcon(getClass().getResource("Ruffy.png"));    //5
    bild3 = new ImageIcon(getClass().getResource("Kirito.png"));   //9
    bild4 = new ImageIcon(getClass().getResource("Rias.png"));     //6
    bild5 = new ImageIcon(getClass().getResource("Son Goku.png")); //3
    bild6 = new ImageIcon(getClass().getResource("Akame.png"));    //2
    bild7 = new ImageIcon(getClass().getResource("Natsu.png"));    //7
    bild8 = new ImageIcon(getClass().getResource("Medaka.png"));   //4
    bild9 = new ImageIcon(getClass().getResource("Lucy.png"));     //8
    bild10 = new ImageIcon(getClass().getResource("Yuno.png"));    //10
    bild11 = new ImageIcon(getClass().getResource("Karte Hintergrund.png"));
   
    //Buttons
    card[0] = new  JButton("", bild1);
    card[1] = new  JButton("", bild2);
    card[2] = new  JButton("", bild3);
    card[3] = new  JButton("", bild4);
    card[4] = new  JButton("", bild5);
    card[5] = new  JButton("", bild6);
    card[6] = new  JButton("", bild7);
    card[7] = new  JButton("", bild8);
    card[8] = new  JButton("", bild9);
    card[9] = new  JButton("", bild10);
    for (int j=0; j<card.length; j++) {
      card[j].addActionListener(new CardListener());
      add(card[j]);
    } // end of for   
   
    //Bilder Karten des Gegners
    for (int i=0; i<hinten.length; i++) {
      hinten[i] = new JLabel(bild11);
      add(hinten[i]);
    } // end of for
   
    //Karte auswählen können
   
    //mit Client1 dem Server auswahl mitteilen --> server muss Client2 auswahl anzeigen
   
    //Client1 muss gegnerauswahl anzeigen
   
    //    gegnerWert = Integer.parseInt(client.getMessage());
    //vergleiche Schaden
   
    //größeres gewinnt, bei unentschieden werden karten auf seite gelegt und warten auf nächste Runde gewinner
    //} while (); // end of do-while
   

  }

  public String getKartenwert() {
    return this.wert;
  }
 
  public boolean getGeklickt() {
    return this.geklickt;
  }

  public class CardListener implements ActionListener{
    Menue m = new Menue();
   
    String wert = "100";
    boolean geklickt = false;
   
    public void actionPerformed (ActionEvent e){
      if (e.getSource() == card[0]) {
        System.out.println("Spiel: " + geklickt + ", " + wert);
       
        this.wert = "1";
        geklickt = true;
       
       
        System.out.println("Spiel: " + geklickt + ", " + wert);
      }  //end of if
      if (e.getSource() == card[1]) {
        this.wert = "5";
        geklickt = true;
      }  //end of if
      if (e.getSource() == card[2]) {
        this.wert = "9";
        geklickt = true;
      }  //end of if
      if (e.getSource() == card[3]) {
        this.wert = "6";
        geklickt = true;
      }  //end of if
      if (e.getSource() == card[4]) {
        this.wert = "3";
        geklickt = true;
      }  //end of if
      if (e.getSource() == card[5]) {
        this.wert= "2";
        geklickt = true;
      }  //end of if
      if (e.getSource() == card[6]) {
        this.wert = "7";
        geklickt = true;
      }  //end of if
      if (e.getSource() == card[7]) {
        this.wert = "4";
        geklickt = true;
      }  //end of if
      if (e.getSource() == card[8]) {
        this.wert = "8";
        geklickt = true;
      }  //end of if
      if (e.getSource() == card[9]) {
        this.wert = "10";
        geklickt = true;
      }  //end of if     
    }   
    MultithreadedClient mtc = new MultithreadedClient(m.getIpAddresse(), m.getPortnummer(), m.getUsername(), wert, geklickt);
    //mtc.start();
  } // end of class SpielFrame 


import java.io.*;
import java.net.*;
import java.util.*;
public class MultithreadedClient {
  Menue menue = new Menue();
  //SpielFrame sf = new SpielFrame();
  boolean aktiv = false;
 
 
  private String IP_ADRESS;
  private int PORT;
  private ArrayList<String> messageBuffer = new ArrayList<String>();
  //private final Scanner SC = new Scanner(System.in);
  private String username;
  private String line;
  //  int zähler = 1;
  //  long t = System.currentTimeMillis();
  //  long end = t+10000;
 
 
 
  public MultithreadedClient(String ipAddresse, int portnummer, String user, String wert, boolean geklickt) {
   
    this.IP_ADRESS = ipAddresse;
    this.PORT = portnummer;
    this.username = user;
    this.line = wert;
    this.aktiv = geklickt;
  }
 
  public void start(){
    try {
      Socket s = new Socket(IP_ADRESS,PORT);
     
      Thread t = new Thread(new Reader(s));
      t.start();
     
      OutputStream os = s.getOutputStream();
      OutputStreamWriter osw = new OutputStreamWriter(os);
      PrintWriter writer = new PrintWriter(osw);
     
      System.out.println("Dies ist ein Multithreading Client");
      System.out.println("----------------------------------");
      while (true) {
        System.out.println("haloo");
        if(!line.isEmpty()){
          writer.println(username+" : "+line);
          writer.flush();
          System.out.println("Client start if");
          warte();
        }else{
          System.out.println("Client start else");
          printMessages();
        }   
       
      } // end of while
     
     
     
     
     
     
    } catch(Exception e) {
     
    }// end of try
  }
 
  public void warte() {
    System.out.println("Client warte: " + aktiv);
    while (!aktiv) {
     
    } // end of while
    start();
  }
 
 
  private void printMessages(){
    if(messageBuffer.isEmpty()){
      System.out.println("Keine Neue Nachrichten");
    }
    for (String message : messageBuffer ) {
      //Wenn eigene Nachrichten nicht ausgegeben werden sollen
      if (!message.startsWith(username+" : ")) {
        System.out.println(message);
      } // end of if
      //Wenn jede Nachricht ausgegeben werden soll
      //System.out.println(message);
    } // end of for
    messageBuffer.clear(); 
    System.out.println("----------------------------------");
    warte();
  }
 
  private class Reader implements Runnable{
    Socket s;
    public Reader(Socket s){
      this.s=s;
    }
   
    public void run(){
      try {
        InputStream is = s.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader reader = new BufferedReader(isr);
        String line;
        while (true) {
          line = reader.readLine();
          if (!line.isEmpty()) {
            messageBuffer.add(line);
          } // end of if
        } // end of while
      } catch(Exception e) {
       
      }
    }
  } // end of class MultithreadedServer
} // end of class MultithreadedClient

import java.net.*;
import java.util.*;
import java.io.*;

public class Server {
  ArrayList<Socket> sockets = new ArrayList<Socket>();
  int port = 10000;
 
 
 
 
  public static void main(String[] args) {
    Server server = new Server();
    server.start();
   
   
  } // end of main
 
  private void start() {
    try {
      System.out.println("multithreaded Server:");
      ServerSocket sServer = new ServerSocket(port);
      while (true) {
        System.out.println("Warte auf Client-Anfrage");
        Socket s = sServer.accept();
        sockets.add(s);
       
        Thread t = new Thread(new Reader(s));
        t.start();
      } // end of while
    } catch(Exception e) {
      System.out.println("1. Fehler: " + e);
    } // end of try
  }
 
 
 
  private class Reader implements Runnable {
    Socket s;
    public Reader(Socket s) {
      this.s = s;
    }
   
    public void run() {
      try {
        InputStream is = s.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String line;
        while (true) {
          line = br.readLine();
          if (!line.isEmpty()) {
            System.out.println(line);
            writeToAll(line);
          } // end of if
        } // end of while
      } catch(Exception e) {
       
      } // end of try
    }
  }
 
 
  private void writeToAll (String line) {
    for (Socket s : sockets) {
      try {
        OutputStream os = s.getOutputStream();
        OutputStreamWriter osw = new OutputStreamWriter(os);
        PrintWriter writer = new PrintWriter(osw);
        writer.println(line);
        writer.flush();
      } catch(Exception ex) {
        System.out.println("2. Fehler: " + ex);
      } // end of try
    } // end of for
  }
 
 
} // end of class Sever
« Letzte Änderung: 07. Januar 2017, 14:13:52 von Bobo »

TheFail

  • Held Mitglied
  • *****
  • Beiträge: 859
  • Karma: 69
  • Kann alles, macht alles, weiß alles ;)
    • Profil anzeigen
Re: While-Schleife -> Programm Absturz
« Antwort #1 am: 04. Januar 2017, 18:39:46 »
Hi Bobo,

Könntest du bitte die Fehlermeldung posten und mir sagen in welcher Klasse in welcher Methode diese while-Schleife hinsoll?
Jetzt allen Code zu lesen und mir zu denken was du gemeint haben könntest, ist doch etwas viel ^^

LG Fail

Schon meinen Notifier gesehen?

Bobo

  • Neuling
  • *
  • Beiträge: 8
  • Karma: 0
    • Profil anzeigen
Re: While-Schleife -> Programm Absturz
« Antwort #2 am: 04. Januar 2017, 21:31:38 »
Hi danke fürs helfen :),

also die Fenster gehen auf aber bei dem MultithreadedClient bleibe ich im code stecken wahrscheinlich hier: "at MultithreadedClient.warte(MultithreadedClient.java:77)" aber ich hab dir mal alles rein gepackt:
Zitat
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
   at java.io.FileOutputStream.write(Unknown Source)
   at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
   at java.io.BufferedOutputStream.flush(Unknown Source)
   at java.io.PrintStream.write(Unknown Source)
   at sun.nio.cs.StreamEncoder.writeBytes(Unknown Source)
   at sun.nio.cs.StreamEncoder.implFlushBuffer(Unknown Source)
   at sun.nio.cs.StreamEncoder.flushBuffer(Unknown Source)
   at java.io.OutputStreamWriter.flushBuffer(Unknown Source)
   at java.io.PrintStream.write(Unknown Source)
   at java.io.PrintStream.print(Unknown Source)
   at java.io.PrintStream.println(Unknown Source)
   at MultithreadedClient.warte(MultithreadedClient.java:77)

ich will halt das der client den kartenwert senden, wenn man auf eine klickt damit nicht so viel ausgegeben wird

TheFail

  • Held Mitglied
  • *****
  • Beiträge: 859
  • Karma: 69
  • Kann alles, macht alles, weiß alles ;)
    • Profil anzeigen
Re: While-Schleife -> Programm Absturz
« Antwort #3 am: 05. Januar 2017, 14:33:28 »
Hi Bobo,
das Problem ist schnell erklärt: du hast da eine mehr oder weniger endlose Rekursion eingebaut. In warte() rufst du immer weiter warte() auf und dann bist du irgendwann so tief, dass der Stack voll ist (daher StackOverflowError). Du hast aber noch dazu eine while-Schleife drumherum, die dieselbe Bedingung testet. Warum machst du es nicht einfach so:
while(!aktiv) { //aktiv == false ist eher schlechter Stil
    //do nothing
    //Bau hier vielleicht ein Thread.sleep() und schlaf ein paar millisekunden - spart deutlich leistung und ist kaum zu bemerken
}
//mach weiter
start()
Dann hast du die (meiner Meinung nach) unnötige Rekursion vermieden und dein Code ist deutlich klarer geworden.

LG Fail

Schon meinen Notifier gesehen?

Bobo

  • Neuling
  • *
  • Beiträge: 8
  • Karma: 0
    • Profil anzeigen
Re: While-Schleife -> Programm Absturz
« Antwort #4 am: 07. Januar 2017, 14:08:38 »
also der Fehler ist jetzt weg (y) aber mein Programm stürtzt trotzdem ab :(

Bobo

  • Neuling
  • *
  • Beiträge: 8
  • Karma: 0
    • Profil anzeigen
Re: While-Schleife -> Programm Absturz
« Antwort #5 am: 07. Januar 2017, 17:52:59 »
Es hat sich erledigt ein Kumpel hat herraus gefunden woran es liegt aber vielen dank für die Hilfe :)) ;)