質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

2812閲覧

JAVAのIOException例外の原因が分からない

donut4

総合スコア148

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/05/07 13:22

編集2021/05/08 13:57

以下のようにURLが有効かどうか判別したいため、下記コードを実行しました。
正しいURLを渡したときは”responseCode”が200になりGOODが出ます。
しかし、有効じゃないURL(https://www.aaaaaaa.co.jp/)を渡したときに、IOExceptionが発生してしまいます。

上手くBADを出力させたいのですが
if文のBADに行かずIOExceptionが出る原因が知りたいです。
何が原因か見当がつかないのですが何かわかる方いますでしょか?

参考
https://www.javaer101.com/ja/article/3343867.html

実行時のコマンド
java converter "https://www.aaaaaaa.co.jp/"

##コード

import java.net.URL; import java.net.MalformedURLException; import java.net.HttpURLConnection; public class converter { public static void main(String[] args) { String path = args[0]; test1(path); } public static void test1(String path) { try { final URL url = new URL(path); HttpURLConnection huc = (HttpURLConnection) url.openConnection(); int responseCode = huc.getResponseCode(); if (responseCode != 404) { System.out.println("GOOD"); } else { System.out.println("BAD"); } }catch (MalformedURLException e){ System.out.println("MalformedURLException"); }catch (IOException e) { e.printStackTrace(); System.out.println("IOException"); } return; } }

##例外時のスタックトレース
java.net.UnknownHostException: www.aaaaaaa.co.jp
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
at sun.security.ssl.BaseSSLSocketImpl.connect(Unknown Source)
at sun.net.NetworkClient.doConnect(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.http.HttpClient.openServer(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
at converter.test1(converter.java:17)
at converter.main(converter.java:10)
IOException

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/05/07 15:08

responseCode をチェックした後に getInputStream などを呼んでたりしませんか?
dodox86

2021/05/07 17:22 編集

momon-gaさんの回答のように私も試してみましたが"GOOD"と出力され、少なくともIOExceptionなどの例外にはなりませんでしたね。(Windows 10上でJava8, 11それぞれで試した) > 実行時のコマンド > java converter "https://www.amazon.co.jp/" となっていますが、提示のコードはクラス名が"test"であり、違います。何か違うものを動かしていませんか?
hoshi-takanori

2021/05/08 17:49

もともと getResponseCode() throws IOException で、サーバーへの接続でエラーが発生した場合には例外が発生することになってるので、仕様通りの動作であり、try 〜 catch するしかないのでは。 https://docs.oracle.com/javase/jp/6/api/java/net/HttpURLConnection.html#getResponseCode() あと、responseCode != 404 だけチェックしてますが、それ以外のエラーコードにも対応した方がいいのでは…。
guest

回答3

0

自己解決

hoshi-takanoriさんのコメントどおり
getResponseCode()は200と401以外は例外を投げるのでBADにはいかないとのことです。

投稿2021/05/09 10:31

donut4

総合スコア148

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2021/05/09 13:27

UnknownHostと、404が返ってくるのは別なので BADは出ることありますよ。
dodox86

2021/05/09 23:23 編集

@質問者さん > hoshi-takanoriさんのコメントどおり > getResponseCode()は200と401以外は例外を投げる hoshi-takanoriさんのコメントを曲解されています。そのようには書かれていません。java.net.UnknownHostExceptionはIOExceptionを継承した例外で、指定のホスト(サーバー)に接続自体できていません。 https://docs.oracle.com/javase/jp/8/docs/api/java/net/UnknownHostException.html 接続してサーバーが200とか404とかHTTPステータスを返して初めてgetResponseCode()で値が返ります。実際、301や503など別の値を返してもIOExceptionはthrowされないので、"GOOD"になります。
guest

0

java

1 }catch (IOException e) { 2 System.out.println("IOException"); 3 }

の部分を、

java

1 }catch (IOException e) { 2 e.printStackTrace(); 3 System.out.println("IOException"); 4 }

にして、詳細な原因がわかるようにしてください。

私の環境では問題なく実行できた(GOODと表示された)ので、プログラムの問題でなく環境の問題かと思われます。
プロキシーなど設定されていないでしょうか?

投稿2021/05/07 17:06

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

hucがnullとなっている可能性があるのでは?

投稿2021/05/07 14:29

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問