Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9でスレッドを使用してスタックトレースを取得するにはどうすればよいですか?


Java 9 StackWalkerを追加しました 現在のスレッドスタックにアクセスするための標準APIを提供するクラス。以前のJavaバージョンでは、 Throwable ::getStackTraceを使用できます。 、 Thread ::getStackTrace 、および SecurityManager ::GetClassContext スレッドスタックを取得するためのメソッドを提供しました。

Thread.getStackTrace() メソッドは、スレッドのスタックダンプを表すスタックトレース要素の配列を返します( StackTraceElement [] )。配列の最初の要素はスタックの最上位を表し、シーケンスの最後のメソッド呼び出しである可能性があり、配列の最後の要素はスタックの最下部を表し、シーケンスの最初のメソッド呼び出しである可能性があります。

構文

public StackTraceElement[] getStackTrace()

import java.lang.StackWalker.Option;

public class GetStackTraceTest {
   public static void main(String args[]) {
      GetStackTraceTest.testPrintCurrnentStackTrace();
      GetStackTraceTest.testShowReflectFrames();
   }
   // get StackTrace using Thread
   public static void testPrintCurrnentStackTrace() {
      StackTraceElement[] stack = Thread.currentThread().getStackTrace();
      for(StackTraceElement element : stack) {
         System.out.println(element);
      }
   }
   // SHOW_REFLECT_FRAMES
   public static void print(StackWalker stackWalker) {
      stackWalker.forEach(stackFrame -> System.out.printf("%6d| %s -> %s %n",
stackFrame.getLineNumber(), stackFrame.getClassName(), stackFrame.getMethodName()));
   }

   public static void testShowReflectFrames() {
      final StackWalker stackWalker = StackWalker.getInstance(Option.SHOW_REFLECT_FRAMES);
      print(stackWalker);
   }
}

出力

java.base/java.lang.Thread.getStackTrace(Thread.java:1654)
GetStackTraceTest.testPrintCurrnentStackTrace(GetStackTraceTest.java:10)
GetStackTraceTest.main(GetStackTraceTest.java:5)
   17| GetStackTraceTest -> print
   25| GetStackTraceTest -> testShowReflectFrames
   6| GetStackTraceTest -> main

  1. Javaを使用している場合のif内でIllegalArgumentExceptionを処理する方法

    IllegalArgumentExceptionを引き起こすメソッドを使用している間、それらの正当な引数を知っているので、事前にif-conditionを使用して引数を制限/検証し、例外を回避できます。 ifステートメントを使用して、メソッドの引数値を制限できます。たとえば、メソッドが特定の範囲の値を受け入れる場合、メソッドを実行する前にifステートメントを使用して引数の範囲を確認できます。 例 次の例は、 setPriority()によって引き起こされるIllegalArgumentExceptionを処理します ifステートメントを使用するメソッド。 import java.util.

  2. Javaを使用してフォルダからディレクトリ(のみ)を取得するにはどうすればよいですか?

    ListFiles()メソッドは、現在の(File)オブジェクトによって表されるパス内のすべてのファイル(およびディレクトリ)のオブジェクト(抽象パス)を保持する配列を返します。 ファイルフィルターインターフェイスは、これをパラメーターとしてlistFiles()メソッドに渡すことができるパス名のフィルターです。このメソッドは、渡されたフィルターに渡されたファイル名をフィルターします。 フォルダ内のディレクトリを取得するには、ディレクトリのみを受け入れるFileFilterを実装し、それをパラメータとしてlistFiles()メソッドに渡します。 以下は、ExampleDirectory