JavaURL对象-新的java.net.URL()
我是java的新手,只是尝试运行一些简单的程序。 我有以下代码:JavaURL对象-新的java.net.URL(),java,url,new-operator,Java,Url,New Operator,我是java的新手,只是尝试运行一些简单的程序。 我有以下代码: 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
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());
}
}
java编译器“找不到symbol:hp”,这让我相信url对象hp不是由以下行创建的:
URL hp = new URL("http://www.java2s.com");
但是catch语句不应该报告错误吗
我尝试在不使用try-catch块的情况下编译,但遇到一个错误,提示“未报告的异常MalformedURLException;必须捕获或声明要抛出”
如果删除最后一行与hp有关的内容,程序将编译并运行,但只显示“一切正常?”
我相信这里有一个简单的解释,但我对java知之甚少。
谢谢当您在try-catch块中定义
hp
时,它的可见性在try块中。因此,在try-catch块之外的print语句中会出现编译错误
在try块开始之前,按以下方式定义hp
:-
URL hp = null;
try{
hp = new URL("http://www.java2s.com");
System.out.println("it all worked?");
System.out.println(hp.getProtocol());
}catch (MalformedURLException e){
System.err.println("New URL failed");
System.err.println("exception thrown: " + e.getMessage());
}
为了更好地理解这一点,请阅读部分14.4.2局部变量声明的范围
此外,为了更安全和正确的编码实践,您应该抛出子句捕获的MalformedURLException
:-
您还需要更新main以引发此异常:-
publicstaticvoidmain(String[]args)抛出畸形的异常
如果您不这样做,您的代码将在URL格式错误的情况下继续 其他答案为您提供了一些避免错误的有用建议。但我想解释一下你对错误含义的理解是如何混乱的 这一行:
URL hp = new URL("http://www.java2s.com");
同时做两件事。它声明了一个名为hp
的变量(编译器通常称之为“符号”),该变量可以指向URL的实例;它创建一个URL实例并使hp
指向它
您将错误解释为“未创建url对象hp”。因此,首先,hp
不是一个对象——它最多是对一个对象的引用,当然它也可以是null
,在这种情况下,它是对空的引用。但是符号hp
在其声明范围内存在,无论是否为其指定了对象引用
如果对象创建失败,即语句的新URL…
部分失败,则很可能会出现您预期的异常。但是,即使由于某种模糊的原因,创建失败但没有引发异常,可能的结果是hp
将null
,在这种情况下,有效地尝试取消对变量hp
的引用将导致NullPointerException
所有这些都只是为了说明您收到的错误与是否为hp
分配了值无关,只是表明hp
未在您尝试使用它的范围内声明
问题是
try
块创建了自己的作用域,因此在块内声明的变量在块外是不可访问的。如果try
块中的第一行仅读取URL,则会收到完全相同的错误代码>。如其他答案所示,解决方法是在try
块之外声明hp
,以便后面的引用有效。(将最后一行移到try
块中也可以,但将该块的内容仅限于需要特定错误处理的语句是有意义的。)解决方案(第一个代码块)的一个小问题是,当抛出一个畸形异常时,“hp”将为null,并且最终的println语句将抛出NullPointerException。(您在评论中提到“如果URL格式不正确,您的代码将继续”)。另一种方法是简单地将println移动到try块中。@Tim-您是否阅读了完整的代码。。。我在第二节中添加了throw子句的内容(因此它将永远不会出现在print语句中,因为它被抛出)。当然,print语句可以在try块中移动,但这是OP的选择。
URL hp = new URL("http://www.java2s.com");