2011-10-07 4 views
4

저는 몇 가지 간단한 프로그램을 실행하려고 할 때 매우 새로운 자바입니다.자바 URL 객체 - 새로운 java.net.URL()

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

    } 
} 

자바 컴파일러는 "기호를 찾을 수 없습니다 : : 마력"

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

의 URL 객체가, HP는 선으로 생성되지 않는 것으로 믿고 나를 이끌 것이다 는이 코드를 그러나 catch 문이 오류를보고해서는 안됩니까?

나는 시도-catch 블록없이 컴파일 시도하지만 난라는 오류 얻고 있었다 "보고되지 않은 예외 않고 MalformedURLException를, 잡은 또는 슬로우 선언해야"내가 마력을 말한다 마지막 줄을 제거하면

의 프로그램을 컴파일하고 실행하지만 "모두 작동 했나요?"라고 표시합니다.

나는 여기에 간단한 설명이있을 것이라고 확신하지만 나는 자바에 대한 많은 지식이 없다. 감사합니다.

답변

5

다른 답변은 오류 예방에 유용한 조언을 제공합니다. 그러나 오류의 의미에 대한 이해가 혼란 스럽다는 것을 설명하려고합니다.

이 줄 :

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

한 번에 두 가지 일을한다. 변수의 선언 (컴파일러에 의해 일반적으로 "심볼"이라고 함)은 URL의 인스턴스를 가리킬 수있는 hp입니다. URL 인스턴스를 생성하고 hp을 가리 킵니다.

"URL 개체 hp가 생성되지 않았습니다"라는 의미의 오류로 해석했습니다. 따라서 먼저, hp은 객체가 아닙니다. 대부분 객체에 대한 참조이며, 물론 null 일 수도 있습니다.이 경우 아무 것도 참조하지 않습니다. 그러나 개체 참조가 할당되었는지 여부에 관계없이 해당 선언의 범위 내에 기호 hp이 있습니다.

개체 생성이 실패한 경우 - 즉 명세서의 new URL ... 부분이 실패한 경우 - 예상 한대로 예외가 발생했을 가능성이 큽니다. 그러나 어떤 확실하지 않은 이유로 생성이 실패했지만 예외가 발생하지 않은 경우에도 hpnull이 될 수 있습니다.이 경우 유효한 hp 참조를 시도하면 NullPointerException이됩니다.

받은 오류는 hp에 값이 할당되었는지 여부와 아무 관계가 없다는 것을 보여 주며 사용하려고 시도하는 범위 내에서 hp이 선언되지 않았 음을 나타냅니다.

블록은 try 블록이 자체 범위를 작성하기 때문에 블록 내에 선언 된 변수를 블록 외부에서 액세스 할 수 없습니다. try 블록의 첫 번째 줄이 단순히 URL hp; 인 경우 똑같은 오류가 발생합니다. 다른 답변에서 볼 수 있듯이이 문제를 해결하려면 을 try 블록 외부에 선언해야하므로 나중에 참조 할 수 있습니다. 마지막 줄을 try 블록으로 옮기는 것도 가능하지만 특정 블록을 처리해야하는 문장으로 만 제한하는 것이 좋습니다.

+0

+1 : 매우 자세한 설명 :) – CoolBeans

5

hp을 try-catch 블록 내에 정의하면 해당 가시성이 try 블록 내에 있습니다. 따라서 try-catch 블록 외부의 print 문에서 컴파일 오류가 발생합니다.

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 Declarationshere을 읽고 이해하기 -이 : try 블록은 다음과 같은 방식으로 시작되기 전에

hp 정의합니다. 또한

안전하고 적절한 코딩 연습, 당신은 당신이 throw 절을 잡을 MalformedURLException 던져해야합니다 : - :

-

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

당신은이 예외를 던져 주를 업데이트해야합니다

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

이렇게하지 않으면 잘못된 URL이있을 경우 코드가 계속됩니다!

+0

솔루션에 약간의 문제가 있습니다 코드 블록)는 MalformedURLException이 발생하면 "hp"가 null이되고 최종 println 문은 NullPointerException을 throw합니다. (당신은 "당신의 코드는 잘못된 URL의 경우에 계속 될 것입니다"라는 코멘트에서 이것을 암시합니다). 또 다른 방법은 println을 try 블록으로 옮기는 것입니다. – Tim

+0

@Tim - 전체 코드를 읽었습니까? 두 번째 섹션에 throw 절을 추가했습니다. 따라서 throw 된 이후 print 문을 만들지 않습니다. 분명히 print 문은 try 블록 내에서 이동할 수 있지만 OP의 선택입니다. – CoolBeans