Desktop browse(URI uri)

  • Themenstarter Themenstarter ItsMeMario2
  • Beginndatum Beginndatum
I

ItsMeMario2

Gast
Hi Leute,

hab ein kleines Problem mit der Java Klasse Desktop.

Java:
public static void open(URI uri) throws URISyntaxException, IOException {
	if(Desktop.isDesktopSupported()) {
		Desktop desktop = Desktop.getDesktop();
		
		if(desktop.isSupported(Desktop.Action.BROWSE)) {
			desktop.browse(uri);
		}
	}
}

Hab das Betriebssystem gewechselt von Windows 7 auf Windows 8.
Wenn ich die oben gepostete Methode unter Windows 8 aufrufe
passiert garnichts, Java GUI friert ein (Nein, kein EDT unterbrochen 😉)

Unter Windows 7 kein Problem. Ist das nun ein OS Problem?
Wenn ja, gibts da schon nen Workaround?
 
Bei mir läuft folgender Code wie erwartet unter NetBeans 7.3 Beta 2 und der Kommandozeile:
Java:
import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;

public class DesktopBrowser {
	public static void main(final String... args) throws IOException {
		System.out.println(open(URI.create("http://www.java-forum.org")));
	}

	public static boolean open(final URI uri) throws IOException {
		if (Desktop.isDesktopSupported()) {
			final Desktop desktop = Desktop.getDesktop();
			if (desktop.isSupported(Desktop.Action.BROWSE)) {
				desktop.browse(uri);
				return true;
			}
		}
		return false;
	}
}
 
[OT]Ich wusste garnicht dass
Java:
main(final String... args)
auch erlaubt ist, seit wann ist das so?[/OT]
 
ich glaube das hängt damit zusammen das VarArgs intern als array verwendet wird womit die normalform main(String[]) ja eingehalten wird ...
und ob du es FINAL machst oder nicht ist dir überlassen und nicht vorgeschrieben
 
ich glaube das hängt damit zusammen das VarArgs intern als array verwendet wird womit die normalform main(String[]) ja eingehalten wird ...
und ob du es FINAL machst oder nicht ist dir überlassen und nicht vorgeschrieben

Ich bin mir aber ziemlich sicher dass:
Java:
private void test(String... test){

}
/* Irgendwo dann: */
String[] bla = {"Hallo", "Bye"};
test(bla);
einen Fehler wirft. Kann mich aber auch irren ???:L
 
nope ... das geht .. genau so wie es da steht ...

als einfachstes beispiel brauchst du dir doch nur mal aus den reflections Method.invoke(Object, Object...) ansehen ...
wenn man diese wrapt weil man z.b. noch einen zusätzlichen parameter einbringen will kann sowohl arrays als auch normale varargs nutzen ... habs selbst schon in beide richtungen ausprobiert ...
 
Offtopic: Falls jemanden die drei Punkte näher interessieren: Nach Ellipse oder variadische Funktion googeln. Braucht man halt wenn man zur Compilezeit noch nicht sagen kann wieviele Parameter eine Methode übergeben bekommen soll.
 
Der einzige Unterschied im Bytecode zwischen Array und VarArgs ist, dass bei der Methode das Flag
Code:
ACC_VARARGS
gesetzt ist.
 
Wikipedia hat gesagt.:
Auch in Java verwendet man in der Deklaration die Ellipse. Hier spricht man von Methoden mit variabler Argumentanzahl, oder kurz Varargs.[4] Im Gegensatz zu C und C++ wird aber der Typ mit angegeben. Im Hintergrund wird die Parameterliste in ein Array übersetzt, so dass auch innerhalb des Funktionsrumpfes der Parameter wie ein Array behandelt werden muss.[5]

wobei fußnote [4] auf einen nicht mehr gültigen link in der java-insel verweist und fußnote [5] direkt zur doc von oracle : Varargs

welche auswirkungen dies direkt auf den byte-code und dessen flags hat wird leider nirgendwo genannt ...
 

Zurück
Oben