JavaURL对象-新的java.net.URL()

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

我是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());

    }
}
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");