Aufbessern meines Codes

MrZylinder

Aktives Mitglied
Hallo Forum,

mein Programm das eine Datei ausließt und in einer TextArea (die in einem Frame is) ausgibts, ist fertig.

Funktioniert eigentlich alles wie es soll.

ABER: Da ich blutiger Anfänger bin würde ich gerne wissen was man an meinem Code vielleicht noch verbessern könnte bzw ordentlicher schreiben könnte.

Hier mein aktueller Code

Java:
public class PopUpTest2 {
	static JFrame frame;
	static JTextArea ta;
	static ArrayList<String> list1;
	static StringBuilder sb;
	
	public static void main(String[] args) throws IOException {
	try {
		list1 = new ArrayList<String>();
		sb = new StringBuilder();
		
                PopUpTest2 db = new PopUpTest2();
		
		final String pfad = JOptionPane.showInputDialog(frame,"Pfad zur status.dat: ");
		String hosts = JOptionPane.showInputDialog(frame,"Wie viel Hosts werden benutzt: ");
		final int eingabeAnzahl = Integer.parseInt(hosts);
		
		ScheduledExecutorService executor=Executors.newScheduledThreadPool(1);
		executor.scheduleWithFixedDelay(new Runnable(){
		    public void run()  {
		    	try {
		    		ta.setText("");
					list1.clear();
		    		BufferedReader br = new BufferedReader(new FileReader(pfad));
		    		int anzahlStatus = 0;
		    		String lesen = br.readLine();
		    		
		    		while((lesen = br.readLine()) != null && anzahlStatus < eingabeAnzahl) 
		    		{
		    			if(lesen.contains("host_name="))
		    			{
		    				list1.add(lesen);
		    			}	
		    			if(lesen.contains("current_state="))
		    			{
		    				anzahlStatus++;
		    			}
		    			if(lesen.contains("current_state=0"))
		    			{
		    				list1.add(", OK");
		    				list1.add("\r\n");
					
		    			}
		    			if(lesen.contains("current_state=1"))
		    			{
		    				list1.add(", WARNING");
		    				list1.add("\r\n");
		    			}
		    			if(lesen.contains("current_state=2"))
		    			{
		    				list1.add(", CRITICAL");
		    				list1.add("\r\n");
		    			}
		    			if(lesen.contains("current_state=3"))
		    			{
		    				list1.add(", UNKNOWN");
		    				list1.add("\r\n");
		    			}
		    			
					}
		    		
		    	}
		    	catch (FileNotFoundException e) 
		    	{
		    			JOptionPane.showMessageDialog(frame,"Datei wurde nicht gefunden!");
		    	} 
		    	catch (IOException e) 
		    	{
					
					e.printStackTrace();
				}
		    	
		        SwingUtilities.invokeLater(new Runnable(){
		        	public void run() {	        		
		            	for(int i=0;i<list1.size();i++)
		    			{
		    				ta.append(list1.get(i));
		    			}
		            	
		            }
		        });
		    }
		},0, 60, TimeUnit.SECONDS);
		
        
	} 
	finally {
		
	}
		
	
}

//Aufbau des Fensters	
public PopUpTest2() {
	frame = new JFrame ("IcingaInfo");
	ta = new JTextArea();	
	frame.setSize(400, 400);
	frame.setVisible(true);
	frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	frame.add(ta);
	ta.setEditable(false);	
	}

}

Im Bezug auf das Finally: Ich weis absolut nicht warum ich das hier brauch. Ich hab mich informiert und verstehe wofür das Finally steht. Ich weis auch das es normalerweise optional ist. Aber mein Eclipse meckert wenn ich es rausnehme.
 
Irgentwer meckert über iwas ist keine sehr gute Beschreibung.

Du fängst

try {

}

an und da fehlt ein catch() oder eben ein finally {}

---

Dein Code hat viel zu lange Methoden.

Dein Action Listener greift auf Attribute zu, die er eigentlich nicht sieht, aber durch die anaonyme Klasse und durch final das doch eingeschränkt geht....

Ist zudem auch viel zu lang.
 
mein Programm geht garnicht in die catch anweisung rein oO
Ist das ein Frage? Ist doch schön wenn es funktioniert.

Das finally gehört zu dem try in Zeile 8. Zu jedem try gehort mindestens ein catch oder finally (Hatte Marcinek ja bereits erläutert). Da Du scheinbar nichts definiert hast, schlägt die IDE eben ein finally vor. Und somit ist die Grammatik wieder korrekt. Allerdings macht das so nicht viel Sinn und es stellt sich die Frage wofür überhaupt das try in Zeile 8?

Der Programmaufbau ist nicht sonderlich schön. Grundsätzlich gehört in die main Methode möglichst wendig Code - im Idealfall nur eine Zeile. Variablen die eigentlich Instanzvariablen sein sollten sind bei Dir static (Weiß nicht ob Dir die Bedeutung von static überhaupt klar ist). Variablennamen sollten sprechend sein. Wird die StringBuilder Variable sb überhaupt verwendet.

Mit
Code:
 String lesen = br.readLine();
vor der while Schleife liest Du die erste Zeile ein und verwirfst sie. Kann man denn sicher davon ausgehen, dass die erste Zeile immer irrelevant ist?
 
Das mein Programm nicht in die catch anweisung reingeht war ne freststellung un ich wundere mich grade warum.. xD?

Also das try brauch ich ja wegen dem BufferedReader. Sonst sagt mein Eclispe...: EY du braucht try catch!...Ich versthe halt net ich hab ja catch drinne....wozu ich dann unbedingt noch ein Finally brauch...

Static deshalb...weil mir das in einem anderen Thread von mir so gesagt wurde. Es hat geklappt un ich hab mir dann keine weiteren gedanken drüber gemacht...Wie lässt sich das anders regeln?

Mit String lesen = br.readLine(); vor der while Schleife liest Du die erste Zeile ein und verwirfst sie.
Ich lese doch damit mein ganzes Dukument aus und nicht nur die erste Zeile oder? Weil die erste Zeile ist für mich nicht relevant. Erst spätere Zeilen.

Das mit dem Stringbuilder hab ich rausgenommen, danke für den hinweis, den hatte ich mal im Anfangsstadium meines Programms benötigt.
 
Jetzt wo du es erwähnst...mein Programm geht garnicht in die catch anweisung rein oO

So soll das im Normalfall auch seien, nur wenn etwas unerwartetes, falsches passiert, also ein Fehler auftritt, soll es da rein, so z.b. wenn die Datei nicht gefunden wird ;-)

ansonsten schließe ich mich den Meinungen meiner vorredner an.

Variablen sollten sinvolle namen haben, als was beinhgalten sie z.B. bei Perosn nenne ich sie name, vorname, adresse,... und nicht string1, string2, string3,...

Die main Methode sollte normalerweise nicht die komplette logik enthalten, sondern es in eigene Methoden schreiben und diese dann aufrufen
 
Das mein Programm nicht in die catch anweisung reingeht war ne freststellung un ich wundere mich grade warum.. xD?
Wenn alles passt und kein Fehler auftritt, warum sollte dann in die catch Anweisung gesprungen werden? Die ist ja nur da für den Fehlerfall.
Also das try brauch ich ja wegen dem BufferedReader.
Dafür hast Du ja das try in Zeile 22
Ich lese doch damit mein ganzes Dukument aus und nicht nur die erste Zeile oder? Weil die erste Zeile ist für mich nicht relevant. Erst spätere Zeilen.
Der Rest wird ja in der while Schleife gelesen. War mir nur nicht sicher, ob Dir bewusst war, dass Du die erste Zeile ignorierst bzw. riskierst das eine IOException geworfen wird.
 
Ach mann:

Dafür hast Du ja das try in Zeile 22

Warum hab ich das 2 mal drinne oO...komisch nicht gesehen muss ich dann verbessern. =)

Mir ist klar das eine Catch anweisung nur dafür da is wenn etwas falsches passiert. hehe. hab mich da wohl falsch ausgedrückt. Ich hab einen falschen pfad meiner datei angegeben und da wurde nicht in die Catch einweisung gesprungen =)

Für den Rest bedanke ich mich schonmal ... versuche dies dann auch auszubessern ^^
 
Jetzt funktioniert das auch ohne Finally und wenn ich einen falschen pfad angebe bekomm ich auch die entsprechende Meldung.
Das lag an meiner "Try-Try-Catch-Catch-Finally"-Kacke (sorry das ich mich so ausdrücke aber anders kann man das glaube ich nicht nennen).

Was mich noch interessieren würde. Kann ich mein InputDialog so einrichten das ich in dem einen nur Buchstaben und in dem andern nur zahlen Eingeben kann/darf?
 
Die Standarddialoge können das m.W. nicht. Aber man kann z.B. ein selbstdefiniertes JTextField, welches die Anforderungen erfüllt, per
Code:
JOptionPane.showMessageDialog(Component, Object, ....
in einen solchen übergeben, oder sich selbst einen Dialog mit
Code:
JDialog
basteln
 

Zurück
Oben