Mik*_*ith 4 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 (MalformedURLException e){
System.err.println("New URL failed");
System.err.println("exception thrown: " + e.getMessage());
}
System.out.println(hp.getProtocol());
}
}
Run Code Online (Sandbox Code Playgroud)
java编译器"找不到符号:hp"这会让我相信url对象,hp不是由行创建的:
URL hp = new URL("http://www.java2s.com");
Run Code Online (Sandbox Code Playgroud)
但是,catch语句不应该报告错误吗?
我尝试在没有try-catch块的情况下进行编译,但是我收到一条错误,说"未报告的异常MalformedURLException;必须被捕获或声明被抛出"
如果我删除引用hp的最后一行,程序将编译并运行,但只显示"它全部工作?".
我确信这里有一个简单的解释,但我对java知之甚少.谢谢
在hptry-catch块内部定义时,其可见性在try块内.因此,您在try-catch块之外的print语句中得到编译错误.
定义hptry块以下方式开始之前: -
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());
}
Run Code Online (Sandbox Code Playgroud)
要理解这一点,请阅读14.4.2 Scope of Local Variable Declarations 此处的部分.
另外,对于更安全和正确的编码实践,你应该抛出MalformedURLException你在throw子句中捕获的内容: -
catch (MalformedURLException e){
System.err.println("New URL failed");
System.err.println("exception thrown: " + e.getMessage());
throw new MalformedURLException("Invalid URL!");
}
Run Code Online (Sandbox Code Playgroud)
您还需要更新您的main以抛出此异常: -
public static void main(String[] args) throws MalformedURLException
如果您不这样做,您的代码将在URL格式错误的情况下继续!
其他答案为您提供了一些避免错误的有用建议.但我想试着解释一下你对错误意味着什么的理解是如何混淆的.
这一行:
URL hp = new URL("http://www.java2s.com");
Run Code Online (Sandbox Code Playgroud)
一次做两件事.它声明了一个名为变量(编译器通常称为"符号")的变量hp,它可以指向URL的实例; 它创建了一个URL实例并hp指向它.
您将错误解释为"未创建url对象hp".所以,首先,hp它不是一个对象 - 它至多是一个对象的引用,当然它也可以是null,在这种情况下它是对任何东西的引用.但是hp,无论是否为其分配了对象引用,该符号都存在于其声明的范围内.
如果对象创建失败 - 即new URL ...语句的部分失败 - 那么很可能会发生异常,就像您预期的那样.但即使由于一些不明原因,创建失败但没有抛出异常,可能的结果hp将是null,在这种情况下,有效的取消引用变量的尝试hp将导致a NullPointerException.
所有这些只是为了说明您收到的错误与是否hp已分配值无关,而只是表示hp尚未在您尝试使用它的范围内声明.
问题是try块会创建自己的范围,因此在块外部无法访问变量.如果try块内的第一行只是读取,您将收到完全相同的错误URL hp;.如其他答案所示,对此的解决方案是hp在try块外声明,以便后面的引用有效.(它也可以将最后一行移动到try块中,但将块的内容仅限于需要特定错误处理的语句是有意义的.)