# Screenshot Programm nach Exception weiterlaufen lassen?



## Fabse (5. Sep 2012)

Hi,

ich glaub ich steh gerade ziemlich auf dem Schlauch...ich möchte jede Minute einen Screenshot von meinem Rechner machen und den speichert er in meinen Dropbox Ordner. Das funktioniert auch soweit gut, nur ab und an verweigert die dropbox den Zugriff (keine Ahnung warum) auf jeden Fall möchte ich dann, dass er es in der nächsten Minute wieder versucht. Aktuell ist es so, dass das Programm beendet wird.


```
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;


public class screenshot {

	
	public static void main(String[] args) throws IOException, AWTException {
		
		Thread thread = new Thread() {
			
			public void run(){
				
				while(!isInterrupted()) {
					
					Robot alarm = null;
					try {
						alarm = new Robot();
					} catch (AWTException e1) {
						
						e1.printStackTrace();
						System.out.println("Fehler Robot");
					}
					BufferedImage bild = new BufferedImage(1920,1080,1);
					Rectangle rec = new Rectangle(0,0,1920,1080);
					
					bild = alarm.createScreenCapture(rec);
					
					
						try {
							
							ImageIO.write(bild, "JPG", new File("C:\\Users\\Fabian\\Desktop\\Dropbox\\Dropbox\\cmc\\Unbenannt-1.jpg"));
							
						} catch (IOException e) {
							
							
						}
					
					}
					
					
					
					try {
						 sleep(60000); // eine Minute
					}catch(InterruptedException e) {
						interrupt();
						System.out.println("Fehler Thread");
						
					}
					
				}
			
			
		};
		
		thread.start();

	}

}
```

Diese Exception schmeißt er mir dann: 



> java.io.FileNotFoundException: C:\Users\Fabian\Desktop\Dropbox\Dropbox\cmc\Unbenannt-1.jpg (Zugriff verweigert)
> at java.io.RandomAccessFile.open(Native Method)
> at java.io.RandomAccessFile.<init>(Unknown Source)
> at javax.imageio.stream.FileImageOutputStream.<init>(Unknown Source)
> ...



Hatte zuerst versucht in dem catch Block wo versucht wird, das Bild in den dropbox ordner zu speichern einen neuen imageIO.write zu machen, wo er mir das Bild auf den Desktop speichert, aber trotzdem kommt sofort die o.g. Exception mit java.io.FileNotFoundException e9 geht es auch nicht.

Ich glaube ich hab da noch etwas nicht verstanden :rtfm:

Ist es nicht so, dass ich in dem try Block etwas schreiben kann was er machen soll und wenn er das nicht kann, dass er dann das aus dem catch block macht!?

Danke


----------



## Xeonkryptos (5. Sep 2012)

Ich lese aus deiner Exception-Meldung auch eine zuvor fliegende NullPointerException, die du auch aufspüren solltest UND du solltest die Signatur der main-Methode überarbeiten. Schmeiß das "throws ..." raus! Das brauchst du nicht, wenn du das catchst.


----------



## z-mon (5. Sep 2012)

Und noch ein Tipp: Klassennamen werden immer Groß geschrieben, und damit meine ich nicht SCREENSHOT


----------



## Fabse (5. Sep 2012)

"throws..." ist weg. Aber mit IOException fang ich doch eigentlich "alles"? :bahnhof:


----------



## z-mon (5. Sep 2012)

Mit "Exceptions" fängst du alles ... aber man sollte immer versuchen die Fehlerquelle so klein wie möglich zu halten.


----------



## Fabse (5. Sep 2012)

Screenshot ist jetzt groß 


```
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;


public class Screenshot {

	
	public static void main(String[] args) {
		
		Thread thread = new Thread() {
			
			public void run(){
				
				while(!isInterrupted()) {
					
					Robot alarm = null;
					try {
						alarm = new Robot();
					} catch (AWTException e1) {
						
						e1.printStackTrace();
						System.out.println("Fehler Robot");
					}
					BufferedImage bild = new BufferedImage(1920,1080,1);
					Rectangle rec = new Rectangle(0,0,1920,1080);
					
					bild = alarm.createScreenCapture(rec);
					
					
						try {
							
							ImageIO.write(bild, "JPG", new File("C:\\Users\\Fabian\\Desktop\\Dropbox\\Dropbox\\cmc\\Unbenannt-1.jpg"));
							
						} catch (IOException e) {
							
							try {
								ImageIO.write(bild, "JPG", new File("C:\\Users\\Fabian\\Desktop\\exception-1.jpg"));
							} catch (IOException e1) {
								
								e1.printStackTrace();
							}
							
						}
					
					}
					
					
					
					try {
						 sleep(60000); // eine Minute
					}catch(InterruptedException e) {
						interrupt();
						System.out.println("Fehler Thread");
						
					}
					
				}
			
			
		};
		
		
		
		thread.start();

	}

}
```

Das wäre jetzt die "schlechte" Lösung wenn sie denn funktionieren würde...er versucht zuerst in die Dropbox zu schreiben wenn das nicht geht, dann halt auf den Desktop. Lieber wäre mir wenn er das bild nicht auf dem desktop schreibt, sondern einfach wieder 60 Sekunden wartet und es dann noch einmal versucht.


----------



## Bile Demon (6. Sep 2012)

Das hat ja mit Dropbox nix zu tun. Du schreibst in ein Verzeichnis im lokalen Filesystem, das mittels Dropbox automatisch synchronisiert wird.

Was mir auffällt, ist, dass du immer unter demselben Dateinamen abspeicherst. Klingt für mich so als würde die Dropbox-Anwendung die Datei noch synchronisieren (=hochladen) während du schon wieder drüberspeichern willst.


----------



## Fabse (6. Sep 2012)

Ja genau ab und zu läuft es durch ohne exception, aber manchmal wird er wohl noch am synchronisieren sein und dann wird der Zugriff verweigert. Dann soll er das einfach überspringen und wieder in sleep gehen, um es dann eine Minute später erneut zu versuchen. Nur wie mach ich das? Extra einen neuen Thread? Gibt's keinen Befehl der den try Block dann auslässt und einfach weiter macht? 

Er soll die Datei immer überschreiben!

Danke


----------



## SlaterB (6. Sep 2012)

ist try-catch so unverständlich?
wie du doch selber sagst/ mit dem Desktop-Bild feststellst: wenn Exception, dann geht es im catch weiter,
ziemlich einfach oder?

wenn also das Dropbox-Bild nicht geht, dann geht es in Zeile 41 weiter,
bisher speicherst du dann auf dem Desktop,

deine Frage ist nun wie das NICHT mehr passiert? nun die einfachste Sache der Welt: streiche die Codezeilen dafür,
lasse das catch leer, dann passiert auch nichts weiter zur Fehlermeldung, ne Logausgabe kann vielleicht nicht schaden,

jedenfalls geht es danach mit aktuell Zeile 50 weiter, 
soviel Effekt hat das catch mindestens, sonst würde die Methode/ der Thread/ das ganze Programm zu Ende sein wie am Anfang

dann übrigens gleich der nächste Schleifendurchlauf,
das sleep(60000) steht erst hinter der Schleife, kommt im Moment nie dran,
wenn du das reinnimmst verschwindet vielleicht auch das Problem


---------

edit:
falls du das nicht gespeicherte Bild nicht verloren geben willst, musst du in der Tat noch mehr arbeiten,
z.B. allein den Block des Speicherns mit einer zweiten Schleife wiederholen bis es klappt,
oder das Bild in einer Variablen außerhalb der Schleife ablegen, beim nächsten Durchlauf keinen neuen Screenshot machen,

mit beidem rettest du vielleicht den ersten, verlierst dann aber womöglich den direkt folgenden Screenshot,
weil ausgelassen bzw. schon viel Zeit vergangen,
wenn du wirklich sicher einen pro Minute haben willst, dann vielleicht wirklich an zwei Threads denken,
einer erzeugt sie, legt sie in einer Liste ab,
ein anderer Thread versucht beharrlich, die Bilder in Reihenfolge abzuspeichern, muss ja nicht auch 60 sec warten, sondern kann öfter versuchen

dabei auf Synchronisation nach Lehrbuch achten,
je nach Kernanzahl/ Ausführung durch Java besteht aber immer noch die Gefahr, dass die Bilder nicht genau alle 60 sec dran kommen, dauern ja selbst sowieso bisschen Zeit, schon ohne zweiten Thread,
eine gewisse Korrektur kann man einbauen, indem man nicht fest 60 sec wartet, sondern bis zu einem Zeitpunkt x, die nächste 00-Minute,
dann das sleep() ausrechnen, es ist gerade 15:40:03? -> 57 sec warten bis 15:41:00


----------



## Fabse (6. Sep 2012)

Danke Slater B, da hatte ich gestern abend doch echt die Klammern quasi vertauscht...habs jetzt auch gesehen, dass das gar nimmer in der Schleife drinn war. Jetzt müsste es ja super funktionieren  Nein den Screenshot brauch ich nicht, der aktuelle ist immer am besten und wenn 3 Minuten mal keiner kommt ist das auch nicht so schlimm


----------

