2012-07-30 2 views
3

소스에서 주소를 추출하고 있지만 일부 추출물에는 http : // infront가 없습니다. 주소에 http : //가 있는지 확인하려면 어떻게해야합니까? http : // infront를 어떻게 추가합니까? : O내 주소 앞에 "Http : //"를 추가하십시오.

내가 추측이 오류를 얻는 것은 HTTP의 "부족"때문입니다 : // 뿅

java.net.MalformedURLException: no protocol: www.speedtest.net 
at java.net.URL.<init>(URL.java:583) 
at java.net.URL.<init>(URL.java:480) 
at java.net.URL.<init>(URL.java:429) 
at a.PageRead.r(PageRead.java:29) 
at a.ThreadDownloaderWriter.run(ThreadDownloaderWriter.java:35) 
at java.lang.Thread.run(Thread.java:722) 






public StringBuilder readPage() { 
     try { 

      URL url = new URL(this.strURL); 
      System.out.println(this.strURL); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); 
      String line; 
      StringBuilder sb = new StringBuilder(); 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 
      reader.close(); 

      return sb; 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
      return new StringBuilder(""); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return new StringBuilder(""); 
     } 
    } 
+2

사용중인 코드를 표시하십시오. – kgautron

답변

6

ADRESS로 시작하는 경우가 확인할 수 있습니다에 "http : //"를 startsWith() 방법을 사용하여 :

이 경우 true이 반환됩니다.

아마도 누락 된 "http : //"문제 일 가능성이 큽니다. documentation은 프로토콜 (http : http)이 필수임을 나타냅니다.

String url = ... ; // Whatever 
if (!url.startsWith("http://")) { 
    url = "http://" + url; 
} 

을하지만 여전히 아주 좋은 해결책이 아니다 :

+0

이 오류는 http : //? – CodeGuru

+0

나는 (자바에게 포트 80을 사용하라고 지시하는) 가능성이 있다고 생각하며, 쉽게 스스로 점검 할 수있는 것이라고 생각한다. 또한 예외를 던지는 코드 줄을 보는 데 도움이됩니다. – kgautron

+0

updated : D ..... – CodeGuru

17

질문에 대한 문자 적 ​​대답은 다음과 같은 형태. 예를 들어 URL은 https일까요? ftp 또는 심지어 파일 시스템 URL은 어떻습니까 (file://)? 그런 다음 실제로는 모두 동일한 의미이며 Java의 URL 클래스에서 허용되지만 대소 문자 구분 ("http://"! = "HTTP://"! = "HttP://")과 같은 것에 대해 생각하는 것이 좋습니다.

당신은 좀 더 조심 시도 할 수 :이 콜론 (:)과 두 개의 슬래시 (//)을 쓴 다음 "단어 문자"에 대해 URL 문자열의 시작 부분과 일치

if (!url.toLowerCase().matches("^\\w+://.*")) { 
    url = "http://" + url; 
} 

다음 URL의 프로토콜 부분이없는 경우 기본값은 http://입니다. 이는 원래 (문자 그대로) 답변보다 훨씬 많은 경우를 다루게됩니다.

궁극적으로 누군가가 프로토콜 부분이없는 URL을 제공하면 잘못된 URL입니다.

Java 프로그래밍에 관한 책은 기본 논리/Java API 문제이므로 모두 읽어보십시오.

+0

이 오류는 http : //? – CodeGuru

+0

@RainbowHat : Probably –

+0

일치하는 정규식이 잘못되었습니다. 전체 URL 문자열이 아닌 한 단어 문자 만 일치합니다. 원한다면 "^ \\ + : //.+"이어야합니다. 그런 식으로. – wi1

2

글쎄, 당신은 new URL(your_url)를 호출하기 전에 내가 확인 말하고 싶지만 당신의 스택 트레이스를 기반으로하는 경우 어느 쪽 HTTP와 your_url 시작 : //, https : //로, 의 ftp : //, 또는 다른 프로토콜 당신은 당신이 확인할 필요가 있다고 생각 :이 누락 된 경우

if(!your_url.startsWith("http://")) 

는 기본 에 http : //을 추가your_url 앞에.

your_url = "http://" + your_url; 

이 오류는 HTTP에 의해 발생 생각하십니까 : //?-

당신의 스택 추적에서

예 :

java.net.MalformedURLException: no protocol: www.speedtest.net 

당신은 www.speedtest.net있는 URL을 가지고 있고 그것은 http://www.speedtest.net 할 필요가있다. 오류는 누락 된 프로토콜로 인해 발생합니다. 일부 웹 사이트가 HTTPS를 가질 수 있기 때문에 또한, 그것은 http://, https:// 같은 단지 유효한 프로토콜, file://

+0

이 오류는 http : //? – CodeGuru

+0

(Y) 위로 올라간다 : D – TransformBinary

2
String url = "www.speedtest.net" 
if (!url.toLowerCase().startsWith("http://")) url = "http://" + url 

그러나이 모든 경우에 작동하지 않을 수 없습니다 : // 또는 다른 프로토콜 .

0
String s = "www.google.com"; 

Pattern p = Pattern.compile("http://"); 

Matcher m = p.matcher(s); 

if (m.lookingAt()){ 


    System.out.println("Its already there"); 

} 
else{ 

     String ss = "http://"+s; 

     System.out.println(ss); 

} 
+0

수정 된 코드로 새로 고침 해주세요 ...... –

+0

이것은'String # startsWith'로 달성 할 수있는 것에 대한 과잉 공격이며's'을 설명하지 않습니다 대문자. 왜 패턴 #에 많은 괄호가 컴파일 되었습니까? – maksimov

1

현재 가장 높은 투표 응답에 잘못된 정규식이 포함되어 있습니다. 아래 해결책은 모든 프로토콜, 대문자 또는 소문자와 일치합니다.

if (!url.matches("^\\w+?://.*")) { 
    url = "http://" + url; 
} 
관련 문제