java URL objet - java.net.URL()
Je suis très nouveau à java, juste essayer d'exécuter des programmes simples.
J'ai ce 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());
}
}
Le compilateur java "impossible de trouver le symbole: hp" qui me porterait à croire que l'url de l'objet, hp n'est pas créé par la ligne:
URL hp = new URL("http://www.java2s.com");
Mais qui ne devrait pas l'instruction catch être signalé une erreur?
J'ai essayé de compiler sans les blocs try-catch mais j'obtenais un message d'erreur indiquant "non déclarée exception MalformedURLException; doivent être pris ou d'déclaré être "jeté"
Si je supprime la dernière ligne qui fait référence à hp, le programme compile et s'exécute, mais affiche juste "tout s'est bien passé?".
Je suis sûr qu'il ya une explication simple ici, mais je n'ai pas beaucoup de connaissances de java.
Grâce
OriginalL'auteur Mike Monteith | 2011-10-07
Vous devez vous connecter pour publier un commentaire.
Autres réponses vous ont donné des conseils utiles sur la façon d'éviter l'erreur. Mais je voudrais essayer d'expliquer comment votre compréhension de ce que l'erreur moyen est confus.
Cette ligne:
fait deux choses à la fois. Il déclare une variable (ce qui est plus généralement appelé par le compilateur comme un "symbole") nommé
hp
, qui peut pointer vers une instance de l'URL; et il crée une instance de l'URL et faithp
point.Vous avez interprété l'erreur de dire "l'objet d'url hp n'est pas en cours de création". Alors, tout d'abord,
hp
n'est pas un objet, c'est tout au plus une référence à un objet, et bien sûr il peut aussi êtrenull
, dans ce cas c'est une référence à rien. Mais le symbolehp
existe, dans le cadre de sa déclaration, indépendamment de savoir si une référence d'objet est affecté.Si la création de l'objet avait échoué -- c'est à dire la
new URL ...
partie de la déclaration avait échoué -- alors très probablement une exception aurait eu lieu comme prévu. Mais même si, pour une raison obscure la création avait échoué, mais pas levée d'une exception, le résultat probable serait quehp
seraitnull
, dans ce cas, un valide tentative de déréférencement de la variablehp
entraînerait uneNullPointerException
.Totalité de ce qui est juste pour illustrer le fait que l'erreur que vous avez reçu n'a rien à voir avec le fait que
hp
a été affecté une valeur, et indique simplement quehp
n'a pas été déclarée dans le champ d'application dans lequel vous essayez de l'utiliser.Le problème est qu'un
try
bloc crée son propre champ d'application, de sorte que les variables déclarées à l'intérieur, il ne sont pas accessibles à l'extérieur du bloc. Vous recevrez exactement la même erreur si la première ligne à l'intérieur de votretry
bloc de lire tout simplementURL hp;
. Comme indiqué dans les autres réponses, la résolution de ce problème consiste à déclarerhp
à l'extérieur de latry
bloc, de sorte que le plus tard de référence est valide. (Il travaille également pour la dernière ligne dans letry
bloc, mais il est logique de limiter le contenu de ce bloc seulement pour les états qui exigent le traitement spécifique des erreurs.)OriginalL'auteur Dave Costa
Lorsque vous définissez
hp
à l'intérieur du bloc try-catch, sa visibilité est dans le bloc try. Par conséquent, vous obtenez l'erreur de compilation dans le rapport d'impression à l'extérieur du bloc try-catch.Définir
hp
avant le bloc try commence de la manière suivante:-Pour mieux comprendre ce lire la section
14.4.2 Scope of Local Variable Declarations
ici.Aussi pour la sécurité et la bonne pratique de codage, vous devriez jeter l'
MalformedURLException
que vous attraper avec la jeter clause:-Vous devrez également mettre à jour votre principal pour lever cette exception:-
public static void main(String[] args) throws MalformedURLException
Si vous ne le faites pas votre code continuera dans le cas d'une URL incorrecte!
avez-vous lu le code complet ... j'ai ajouté le jeter clause de trucs dans la deuxième section (donc il ne le fera jamais à l'instruction print puisqu'il est jeté). Sûrement l'instruction print peut être déplacé à l'intérieur du bloc try, mais c'est OP.
OriginalL'auteur CoolBeans