コードに_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
}
_
私の問題の原因は何ですか?どうすれば解決できますか?
メッセージとスタックトレースは、2つの異なる情報です。 stackstraceは必須ですが、メッセージは必須ではありません。ほとんどの例外にはメッセージが含まれており、それを行うことをお勧めしますが、一部の例外にはメッセージが含まれていないため、修正するために何もする必要はありません。
ただし、クライアントにとってより簡単にし、メッセージなしの例外をラップするか、元の例外を原因としてカスタム例外をスローすることにより、メッセージを提供できます。これは次のようになります。
throw new MyRuntimeException("Socket was closed unexpectedly", e);
SocketTimeOutExceptionは、例外のタイプです。おそらく、この例外(またはそれをスローするコード)が例外をメッセージに提供することを気にせず、例外のタイプが十分に意味があると考えたためでしょう。使用する
Log.d("Error", "Error Message: " + e);
または
Log.d("Error", "Some exception occurred", e);
メッセージを尋ねるのではなく。
e.printstacktrace()は、ほとんど常に存在する実際のスタックトレースを意味します。ただし、メッセージはそうではありません。 getMessage() メソッドのJavadocを確認すると、nullが返される場合があります。 String message paramで例外からコンストラクターを呼び出すとメッセージが表示されます Exception Javadoc
コードでスローされる例外にはメッセージはないと思います。ストリングはヌルです。しかし、もちろん、スタックトレースを印刷できます。これらは2つの異なるものです。スタックトレースが表示されますが、メッセージは表示されません。
E.getMessage()の代わりに、ロガーに例外自体を与えるようにしてください。通常、ロガーにはThrowableオブジェクトを期待するメソッドがあり、ロガーのデフォルト構成(通常)はスタックトレースを出力します。