繁体   English   中英

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

[英]java URL object - new java.net.URL()

我是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编译器“找不到符号: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 Scope of Local Variable Declarations 在这里

另外,对于更安全和正确的编码实践,您应该抛出您使用throw子句捕获的MalformedURLException : -

catch (MalformedURLException e){
            System.err.println("New URL failed");
            System.err.println("exception thrown: " + e.getMessage());
            throw new MalformedURLException("Invalid URL!");
        }

您还需要更新您的main以抛出此异常: -

public static void main(String[] args) throws MalformedURLException

如果您不这样做,您的代码将在URL格式错误的情况下继续!

其他答案为您提供了一些避免错误的有用建议。 但我想试着解释一下你对错误意味着什么的理解是如何混淆的。

这一行:

URL hp = new URL("http://www.java2s.com");

一次做两件事。 它声明了一个名为hp的变量(编译器通常将其称为“符号”),它可以指向URL的实例; 它创建了一个URL实例,并使hp指向它。

您将错误解释为“未创建url对象hp”。 所以,首先, hp不是一个对象 - 它最多只是一个对象的引用,当然它也可以是null ,在这种情况下它是对任何东西的引用。 但是,符号hp在其声明的范围内存在,无论是否为其分配了对象引用。

如果对象创建失败 - 即语句的new URL ...部分失败 - 那么很可能会发生异常,就像您预期的那样。 但即使由于某些模糊的原因,创建失败但没有抛出异常,可能的结果是hp将为null ,在这种情况下,有效尝试取消引用变量hp将导致NullPointerException

所有这些只是为了说明您收到的错误与hp是否已分配值无关,而只是表示hp尚未在您尝试使用它的范围内声明。

问题是try块创建了自己的作用域,因此在块外部无法访问其中声明的变量。 如果try块中的第一行只读取URL hp;您将收到完全相同的错误URL hp; 如其他答案所示,对此的解决方法是在try块之外声明hp ,以便后面的引用有效。 (它也可以将最后一行移动到try块中,但将该块的内容仅限于需要特定错误处理的语句是有意义的。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM