java URL-Objekt - new-java.net.URL()
Ich bin sehr neu in java, nur versuchen, einige einfache Programme.
Ich habe diesen code:
import java.net.*;
import java.io.*;
class example1 {
public static void main(String args[]){
try{
URL hp = new URL("http://www.java2s.com");
System.out.println("it all worked?");
}catch (MalformedURLException e){
System.err.println("New URL failed");
System.err.println("exception thrown: " + e.getMessage());
}
System.out.println(hp.getProtocol());
}
}
Den java-compiler "cannot find symbol: "hp", was dazu führen würde, mir zu glauben, dass das url-Objekt ist, ist hp nicht erstellt werden, indem die Zeile:
URL hp = new URL("http://www.java2s.com");
Aber sollte nicht die catch-Anweisung meldet einen Fehler?
Habe ich versucht zu kompilieren, ohne die try-catch-Blöcke zu, aber ich wurde immer eine Fehlermeldung angezeigt "unreported exception MalformedURLException; muss abgefangen werden oder erklärt werden geworfen"
Wenn ich die Letzte Zeile zu entfernen, bezieht sich auf hp, das Programm kompiliert und ausgeführt wird aber nur angezeigt "es hat alles?".
Ich bin sicher, es gibt eine einfache Erklärung hier, aber ich habe nicht viel Kenntnisse von java.
Dank
InformationsquelleAutor Mike Monteith | 2011-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den anderen Antworten gegeben haben, Ihnen einige nützliche Ratschläge, die Vermeidung der Fehler. Aber ich möchte versuchen zu erklären, wie zu verstehen, was der Fehler bedeutet ist verwirrt.
Diese Zeile:
macht zwei Dinge auf einmal. Es deklariert eine variable (das ist allgemein bezeichnet durch den compiler als "symbol") mit dem Namen
hp
, die auf eine Instanz von URL; und es erstellt eine Instanz von URL und machthp
Punkt.Sie interpretiert den Fehler zu meinen, "das url Objekt ist hp nicht erstellt werden". Also, zunächst
hp
ist nicht ein Objekt-es ist höchstens eine Referenz auf ein Objekt, und natürlich kann es auch seinnull
, in dem Fall ist es eine Referenz zu nichts. Aber das symbolhp
vorhanden ist, im Rahmen seiner Erklärung, unabhängig davon, ob eine Referenz auf ein Objekt zugewiesen.Wenn das Objekt der Schöpfung versagt hatte, D. H.
new URL ...
Teil der Anweisung, die versagt hatte, -- und dann wahrscheinlich eine Ausnahme aufgetreten wären wie Sie es erwartet haben. Aber auch wenn für einige obskure Grund der Schöpfung versagt hatte, aber nicht geworfen eine Ausnahme, das wahrscheinliche Ergebnis wäre, dasshp
wärenull
, in dem Fall einen gültigen Versuch zur Dereferenzierung der Variablenhp
führen würdeNullPointerException
.All das nur um zu verdeutlichen, dass die Fehlermeldung, die Sie erhalten hat nichts damit zu tun, ob
hp
wurde ein Wert zugewiesen, und zeigt einfach an, dasshp
wurde nicht deklariert in dem Bereich, in dem Sie versuchen, es zu benutzen.Das Problem ist, dass ein
try
block Ihren eigenen Bereich erstellt, also Variablen, die innerhalb es sind nicht zugänglich, außerhalb des Blocks. Erhalten Sie genau die gleichen Fehler, wenn die erste Zeile in Ihremtry
block zu Lesen einfachURL hp;
. Wie in den anderen Antworten, die Lösung HIERFÜR ist es zu erklärenhp
außerhalb dertry
sperren, so dass der spätere Referenz gültig ist. (Es würde auch funktionieren, verschieben Sie die Letzte Zeile in dertry
block, aber es macht Sinn, beschränken Sie den Inhalt des Blocks nur auf die Aussagen, die erfordern, dass spezifische Fehlerbehandlung.)InformationsquelleAutor Dave Costa
Beim definieren
hp
innerhalb des try-catch-block, seine Sichtbarkeit innerhalb des try-Blocks. Somit erhalten Sie die Kompilierungs-Fehler in der print-Anweisung außerhalb des try-catch-block.Definieren
hp
vor der try-block beginnt in folgender Weise:-Um diese besser zu verstehen, Lesen Sie den Abschnitt
14.4.2 Scope of Local Variable Declarations
hier.Auch für mehr Sicherheit und richtige Codierung der Praxis, sollten Sie werfen die
MalformedURLException
dass Sie fangen mit der werfen Klausel:-Müssen Sie auch aktualisieren Sie Ihr Haupt zu werfen, diese Ausnahme:-
public static void main(String[] args) throws MalformedURLException
Wenn Sie dies nicht tun, Ihren code weiterhin im Falle einer fehlerhaften URL!
haben Sie Lesen Sie den vollständigen code ... ich habe den throw-Klausel Zeug in den zweiten Abschnitt (also es wird niemals die print-Anweisung, da es geworfen wird). Sicherlich die print-Anweisung verschoben werden können, die innerhalb des try-block aber, dass die OP der Wahl.
InformationsquelleAutor CoolBeans