目次
5.1.e.toString() と getMessage()
1. テストケース
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* @ClassName: T2
* @Author: BlueBlue
* @Description: 异常测试
* @Date: 2023/5/9 0009 10:51
*/
public class T2 {
private static Logger logger = LoggerFactory.getLogger(T2.class);
public static void main(String[] args) {
try{
List list = null;
list.add("1");
list.add("2");
for (Object a: list) {
System.out.println(a);
}
}catch (Exception e){
logger.info("toString:"+e.toString());
logger.info("getMessage:"+e.getMessage());
logger.info("getStackTrace:"+e.getStackTrace());
logger.info("e:"+e);
e.printStackTrace();
}
}
}
2. コンソール表示
2023-05-10 14:56:15.317 INFO --- [ main]
com.task.test.T2 : toString:java.lang.NullPointerException
2023-05-10 14:56:15.326 INFO --- [ main]
com.task.test.T2 : getMessage:null
2023-05-10 14:56:15.327 INFO --- [ main]
com.task.test.T2 : getStackTrace:[Ljava.lang.StackTraceElement;@475530b9
2023-05-10 14:56:15.328 INFO --- [ main]
com.task.test.T2 : e:java.lang.NullPointerException
java.lang.NullPointerException
at com.task.test.T2.main(T2.java:22)
3. ログファイルの印刷
4. 違い
この記事では、上記のテスト ケースからわかるように 、5 種類の異常な印刷(e、e.toString()、e.getMessage()、e.getStackTrace()、e.printStackTrace();) をテストしました。
1) e、e.toString() および e.printStackTrace(); は同じ印刷効果があり、どちらも例外を表示し、取得される情報には例外の種類と例外の詳細が含まれます。
ただし、 e.printStackTrace(); は、特定の行に固有の詳細を表示します。欠点は、ログ ファイルに出力できないことですが、コードを手動で定義してログ ファイルに書き込むことができます。
eについては、以下で詳しく紹介するので、ここでは紹介しません。
2) e.getMessage()は例外の詳細メッセージ文字列のみを取得し、ログファイルに出力します。
3) e.getStackTrace() は、スレッドを表すスタック トレース要素の配列を返します。スレッドが開始されていないか終了している場合、このメソッドは長さ 0 の配列を返します。返された配列が長さ 0 でない場合、その最初の要素はスタックの最上位を表します。これは、配列内の最新のメソッド呼び出しです。最後の要素はスタックの最下位を表し、配列内で最も古いメソッド呼び出しです。
5. ソースコード表示
5.1.e.toString() と getMessage()
/**
* Returns a short description of this throwable.
* The result is the concatenation of:
* <ul>
* <li> the {@linkplain Class#getName() name} of the class of this object
* <li> ": " (a colon and a space)
* <li> the result of invoking this object's {@link #getLocalizedMessage}
* method
* </ul>
* If {@code getLocalizedMessage} returns {@code null}, then just
* the class name is returned.
*
* @return a string representation of this throwable.
*/
/**
* 返回一个简短的描述关于此异常
* 获取此异常的根路径和方法名称
* 返回是此类中某方法的返回
* 三目运算
*/
public String toString() {
String s = getClass().getName();
String message = getLocalizedMessage();
return (message != null) ? (s + ": " + message) : s;
}
/**
* Creates a localized description of this throwable.
* Subclasses may override this method in order to produce a
* locale-specific message. For subclasses that do not override this
* method, the default implementation returns the same result as
* {@code getMessage()}.
*
* @return The localized description of this throwable.
* @since JDK1.1
*/
public String getLocalizedMessage() {
return getMessage();
}
/**
* Returns the detail message string of this throwable.
*
* @return the detail message string of this {@code Throwable} instance
* (which may be {@code null}).
*/
public String getMessage() {
return detailMessage;
}
/**
* Specific details about the Throwable. For example, for
* {@code FileNotFoundException}, this contains the name of
* the file that could not be found.
*
* @serial
*/
private String detailMessage;
toString 上のコメントは英語ですが、理解できる方は英語で読んでみてください。英語の方が詳しく書かれているため、中国語訳は不正確な可能性があります。
e.toStringの呼び出し処理ではgetMessage()メソッドが呼び出され、例外の詳細情報が返されます。
5.2.e
ここで、 e は Exception 型の例外オブジェクトです。もちろん、例外タイプとオブジェクト名は自分のニーズや好みに応じて変更できますが、誰もが例外オブジェクトに e を使用して名前を付けることに慣れています。完成させると理解しやすいかもしれません:
Exception e = new Exception("运行时异常");
同時に、オブジェクトであるため、独自のメソッドを持つこともあります。書かれていない場合、デフォルトはパラメータなしの構築です。
コードがたくさんあるので、スクリーンショットを撮って表示してください。
例外を再スローします—fillInStackTrace()
fillInStackTrace は最初に stackTrace が null かどうかを判断し、null でない場合はネイティブ メソッドfillInStackTrace を呼び出して、現在のスレッドのスタック フレーム情報をこの Throwable に記録します 。
stackTrace は、現在の例外スタック情報を記録します。配列内の各 StackTraceElement は、現在のメソッド呼び出しのスタック フレームを表し、メソッド呼び出しを表します。
バックトレース ネイティブ コードがいくつかのスタック バックトレース ポインターをスロットに保存するとき
現在のメソッドのクラス名、メソッド名、ファイル名、行番号の情報が StackTraceElement に保存されます。
5.3.e.getStackTrace()
printStackTrace() によって出力されるスタック トレース情報へのプログラムによるアクセスを提供します。スタック トレース要素の配列。各要素はスタック フレームを表します。配列の 0 番目の要素 (配列の長さが 0 以外であると仮定) はスタックの先頭を表し、シーケンス内の最後のメソッド呼び出しになります。
場合によっては、一部の仮想マシンがスタック トレースから 1 つ以上のスタック フレームを省略することがあります。極端な場合には、スタック トレース情報を含まない仮想マシンがこのメソッドから長さ 0 の配列を返すことが許可されます。一般に、このメソッドによって返される配列には、printStackTrace によって出力されるフレームごとに 1 つの要素が含まれます。返された配列への書き込みは、このメソッドの後続の呼び出しには影響しません。
戻り値: このスロー可能オブジェクトに関連付けられたスタック トレースを表すスタック トレース要素の配列。
getStackTrace()はgetOurStackTraceメソッドで取得したStackTraceElement[]配列を返しますが、このStackTraceElementがERRORによる各原因の情報となります。ユーザーは、printStackTrace() よりも詳細な印刷情報を自分のニーズに応じて取得できます。
printStackTrace() は void 値を返しますが、そのメソッドが現在の受信印刷ストリームを内部でロックし、さらに getOurStackTrace メソッドを通じて StackTraceElement[] 配列を取得していることがわかります。ただし、printStackTrace() メソッドは配列を直接出力します。
六、小言
さまざまなログ出力を知ることが開発の基礎です。ソース コードを研究する目的は、上級バージョンで例外をカスタマイズできるように、これらのメソッドがどのように実装されているかを理解することです。ただし、カスタム例外についてはこの記事では紹介しません。