web-dev-qa-db-ja.com

例外メッセージはヌルですか?

コードに_try-catch_ステートメントがあります。私のcatchブロックでは、e.getMessage()を呼び出して、例外のメッセージを出力しています。ただし、_e.getMessage_はnull値を返し続けます。興味深いことに、_e.printStackTrace,_を呼び出すと、スタックトレースの印刷に問題はありません。

以下は私のコードです:

_try
{
    console = new BufferedReader(new InputStreamReader(httpsURLConnection.getInputStream()));
}catch(Exception e)
{
    Log.d("Error", "Error Message: " + e.getMessage()); //e.getMessage is returning a null value
    e.printStackTrace(); //this works. is displaying a SocketTimeOutException
}
_

私の問題の原因は何ですか?どうすれば解決できますか?

31
Arci

メッセージとスタックトレースは、2つの異なる情報です。 stackstraceは必須ですが、メッセージは必須ではありません。ほとんどの例外にはメッセージが含まれており、それを行うことをお勧めしますが、一部の例外にはメッセージが含まれていないため、修正するために何もする必要はありません。

ただし、クライアントにとってより簡単にし、メッセージなしの例外をラップするか、元の例外を原因としてカスタム例外をスローすることにより、メッセージを提供できます。これは次のようになります。

throw new  MyRuntimeException("Socket was closed unexpectedly", e);
21
kostja

SocketTimeOutExceptionは、例外のタイプです。おそらく、この例外(またはそれをスローするコード)が例外をメッセージに提供することを気にせず、例外のタイプが十分に意味があると考えたためでしょう。使用する

Log.d("Error", "Error Message: " + e);

または

Log.d("Error", "Some exception occurred", e);

メッセージを尋ねるのではなく。

9
JB Nizet

e.printstacktrace()は、ほとんど常に存在する実際のスタックトレースを意味します。ただし、メッセージはそうではありません。 getMessage() メソッドのJavadocを確認すると、nullが返される場合があります。 String message paramで例外からコンストラクターを呼び出すとメッセージが表示されます Exception Javadoc

2
bvanvelsen

コードでスローされる例外にはメッセージはないと思います。ストリングはヌルです。しかし、もちろん、スタックトレースを印刷できます。これらは2つの異なるものです。スタックトレースが表示されますが、メッセージは表示されません。

1
Tobias Breßler

E.getMessage()の代わりに、ロガーに例外自体を与えるようにしてください。通常、ロガーにはThrowableオブジェクトを期待するメソッドがあり、ロガーのデフォルト構成(通常)はスタックトレースを出力します。

1
anilsinaci