4

ソースからアドレスを抽出していますが、一部の抽出ではアドレスの前にhttp://がありません。アドレスにhttp://があるかどうかを確認するにはどうすればよいですか?:O

私が推測するこのエラーを取得するのは、http://infrontの「欠如」が原因です

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

6 に答える 6

19

あなたの質問に対する文字通りの答えは次のようになります。

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

しかし、それはまだあまり良い解決策ではありません。たとえば、 URL はhttpsどうでしょうか。ftp やファイルシステムの URL ( ) はどうでしょうかfile://http://そして、大文字と小文字の区別 (" " != " HTTP://" != " HttP://" にもかかわらず、実際にはそれらはすべて同じことを意味し、Java のURLクラスによって受け入れられることになります)などについて考えたいと思うかもしれません。

もう少し注意してみてください:

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

:これは、URL 文字列の先頭を、コロン ( ) と 2 つのスラッシュ ( )が続く任意の「単語文字」と照合し、URLのプロトコル部分が欠落している場合に//デフォルトに設定します。http://これにより、元の(文字通りの)回答よりもはるかに多くのケースがカバーされます。

最終的に、誰かがプロトコル部分のない URL を提供した場合、それは無効な URL です。

これらはすべて基本的なロジック/Java APIの問題であるため、Javaプログラミングに関する本を手に入れることを検討する必要があります。

于 2012-07-30T16:47:32.090 に答える
6

startsWith()次のメソッドを使用して、アドレスが「http://」で始まるかどうかを確認できます。

url.startsWith("http://");

trueその場合に返されます。

「http://」の欠落が問題であることはおそらく正しいでしょう。ドキュメントは、プロトコル (ここでは http) が必須であることを示しているようです。

于 2012-07-30T16:46:59.017 に答える
2

スタック トレースに基づいて、 を呼び出す前に、 http://https://ftp://、または確認する必要があると思われるその他のプロトコルで始まるかnew URL(your_url)どうかを確認します。your_url

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

欠落している場合は、デフォルトのhttp://を の前に追加しますyour_url

your_url = "http://" + your_url;

このエラーは http:// が原因だと思いますか? –</p>

はい、スタック トレースで:

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

である URL がありwww.speedtest.net、それが である必要がありますhttp://www.speedtest.net。このエラーは、プロトコルが欠落しているために発生します。または、 である必要はなく、、 などhttp://の有効なプロトコルだけです。https://file://

于 2012-07-30T16:47:34.663 に答える
2
String url = "www.speedtest.net"
if (!url.toLowerCase().startsWith("http://")) url = "http://" + url

ただし、一部の Web サイトには https:// やその他のプロトコルが使用されている場合があるため、これがすべての場合に機能するとは限りません。

于 2012-07-30T16:48:17.787 に答える
1

現在最も投票数の多い回答には、正しくない正規表現が含まれています。以下のソリューションは、大文字または小文字の任意のプロトコルに一致します。

if (!url.matches("^\\w+?://.*")) {
  url = "http://" + url;
}
于 2013-05-24T09:33:43.347 に答える
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);

 }
于 2012-07-30T16:59:29.180 に答える