「Javaコアテクノロジー」の注意事項(3)-例外処理

JavaCoreNote例外

エラーが原因で一部の操作が完了しない場合、プログラムは
次のことを行う必要があります。•安全な状態に戻り、ユーザーが他のコマンドを実行
できるようにする、または•ユーザーがすべての操作の結果を保存してプログラムを適切に終了できるようにする

異常な

for:エラーが発生した場所から、この状況を処理できるエラープロセッサに制御を移す

プログラムエラーの分類:

  1. ユーザー入力
  2. 物理的な制限
  3. 装備
  4. コード
    処理方法:特別なエラーコードを返します。値は返さず、例外情報をカプセル化するオブジェクトをスローして、対応するエラーハンドラーを見つけます。

文法

分類
  • チェックされていない例外(チェックされていない)
    エラー、RuntimeException
    エラークラス階層は、Javaランタイムシステムの内部エラーとリソース枯渇エラーを記述します;
    RuntimeException:状況を含む、プログラムエラーが原因の例外:

    • 間違った型変換
    • 範囲外の配列アクセス
    • nullポインターへのアクセス
      RuntimeExceptionが発生した場合は、プログラマーの問題である必要があります。
  • チェックされた例外(チェックされた)
    non-RuntimeExceptionは、プログラム自体には問題がないが、IOエラーなどの例外が原因であることを意味します

いつ宣言するか
  1. チェックされた例外をスローするメソッドを呼び出す
  2. プログラムの実行中にエラーが見つかり、throwステートメントを使用してチェック例外がスローされました
  3. プログラムにエラーがあり、未チェックの例外をスローします
  4. 仮想マシンとランタイムライブラリの内部エラー

注:Errorから継承されたエラーおよびRuntimeExceptionから継承された例外は宣言しないでください。

メソッドは、スローされる可能性のあるすべてのチェック済み例外を宣言する必要があり、チェックなしの例外は制御できない(エラー)か、回避する必要があります(RuntimeException)

例外を投げる
  1. 適切な例外クラスを見つける
  2. 例外クラスオブジェクトを作成する
  3. オブジェクトを投げる

例外クラスを定義します。Exceptionまたはそのサブクラスから派生したクラスで、2つのコンストラクターを提供し
ます。注:サブクラスのスロー指定子は、スーパークラスメソッドによってリストされた例外クラスのスコープを超えることはできません。

例外をキャッチ
  • ブロックを試す/キャッチ
  • いつキャッチし、いつスローするか?-処理方法を知っている例外
  • 複数の例外をキャッチする場合、異常変数は暗黙的に最終変数です
  • 例外は、catchステートメントで再度スローできます。例外のタイプを変換するには、例外の原因をinitCauseに設定し、getCauseを再取得できます。
ついに節

for:リソースのリサイクルの問題、finally句がない場合、同じコードが2か所に表示されます。
finally句のreturn句は、tryのreturnをオーバーライドします

try / catchおよびtry / finallyステートメントブロックを分離し、内側の層はリソースを閉じる責任があり、外側の層は例外が報告されていることを確認する責任があります

InputStrean in = . . .;
try
{
    try
    {
        code that might throwexceptions
    }
    finally
    {
        in.cose(); 
    } 
}
catch (IOException e) {
    show error message
}

finally節は例外を生成し、元の例外情報を上書きする場合があります。

リソースを使ってステートメントを試す
  • リソースは、AutoClosableインターフェースを実装するクラスに属し、自動的にcloseメソッドを呼び出します。
  • リソースを含むtryステートメントには、独自のcatch、finally句を含めることもできます。これらの句は、リソースを閉じるための呼び出しの後に実行されます。実際には、あまり多くのコンテンツを追加しないでください。これがこのように使用されることはほとんどありません。
    finally句が元の例外をカバーする例外を生成する問題の場合、addSuppressdメソッドが自動的に呼び出されて、元の例外の抑制された例外に追加され、元の例外がスローされます。プロセッサはgetSuppressedを呼び出して、例外リストを取得できます。
スタックトレース
  • Throwable.printStackTrace、getStackTrace
  • Thread.getAllStackTrace

使用のヒント

  1. 例外処理は単純なテストを置き換えることはできません
  2. 例外を絞り込みすぎてコードが肥大化しないようにしてください
  3. 例外階層を活用する
  4. 異常を抑えない
  5. エラーを検出する場合、厳しさは自由放任よりも優れています(早期に投げる)
  6. 例外を渡すことをためらわないでください(遅延キャッチ)

断言

for:選択的に検出を有効にする

アサーションメカニズムにより、テスト中に一部のチェックステートメントをコードに挿入できます。コードがリリースされると、これらの挿入された検出ステートメントは自動的に削除されます

使用する

  1. アサート条件;
    アサート条件:式;
    条件が確立されていない場合、AssertionError例外がスローされ、2番目の形式の式は説明文字列を生成します。

  2. 有効化と無効化
    は再コンパイルを必要としません。これはクラスローダーの機能です。
    有効化:-enableassertionsまたは-ea
    はクラスまたはパッケージで有効化できます:
    java -ea:MyClass -ea:com.mycompany.mylib ... MyAppは
    無効化されます:-disableassertionsまたは-da

システムクラス(クラスローダーなし)の場合:enablesystemassertions / -esa
プログラムも制御できます。APIを参照してください

  1. いつ使うか
  • アサーションエラーは致命的で回復不可能なエラーです。
  • アサーションチェックは、開発およびテスト段階でのみ使用されます

ログ

ロギングAPIの利点:

  1. ログレコードのすべてまたは特定のレベルを開いたり、キャンセルしたりするのは簡単です。
  2. 異なるプロセッサーに転送できます。
  3. レコーダーとプロセッサーはレコードをフィルタリングできます。
  4. さまざまな方法でフォーマットされています。
  5. 複数のロガーを使用できます。
  6. デフォルトでは設定ファイルによって制御され、設定はプログラムで置き換えることもできます。

基本ログ

  1. グローバルロガーを呼び出す
  2. キャンセル:Logger.getGlobal().SetLevel(オフ)

高度なログ

  1. レコーダーには階層構造があり、子は親の属性を継承します
  2. 7つのレベル:重大、警告、情報、構成、ファイン、ファイナー、ファイネスト、デフォルトでは最初の3つ

デフォルトでは、クラス名とメソッド名の情報が記録されますが、正確な呼び出し情報を取得するためにVMが最適化されていない可能性があります。logpメソッドを使用して、呼び出しクラスとメソッドの正確な情報を取得できます

役割:

  1. 実行フローの追跡に使用される方法:開始、終了
  2. 予期しない例外のログ:スロー、ログ

ログマネージャーの構成を変更する

デフォルト:jre / lib / 1ogging.properties
変更:java -Djava.util.logging.config.file = configFile MainClass

ログレベル名を変更します。レベル= FINE
デフォルトログマネージャ:java.util.logging.LogManager
は、システムプロパティjava.util.logging.manager を使用して変更できます。

プロセッサー

  • デフォルトでConsoleHandlerを使用する
  • デフォルトのINFOレベルjava.uti1.1ogging.ConsoleHandler.level
  • デフォルトでプロセッサと親プロセッサに送信

その他のプロセッサ:FileHandler、SocketHandler
はファイルプロセッサのデフォルトの動作を変更できます

フィルター

Filter、setFilterメソッドをレコーダーまたはプロセッサーに実装する

フォーマット

フォーマッタを実装し、プロセッサでsetFormatterメソッドを使用します

一般的な操作

  1. ロガーはメインパッケージ名として名前が付けられます
  2. プログラムにデフォルト設定をインストールします
  3. ユーザーに役立つログのみが最初の3つのレベルに設定され、コンソールに表示されます。

デバッグスキル

  1. 変数を出力します。
  2. クラスにmainメソッドを配置し、各クラスを単体テストします。
  3. JUnitを使用してテストケースを整理する
  4. ロギングプロキシを使用してメソッド呼び出しをインターセプトし、ログを記録する
  5. スタックトレースを表示するThread.dumpStack()
  6. スタックトレースを文字列にキャプチャする
  7. エラー情報をファイルに保存java MyProgram 2> errors.txt
    java MyProgram 1> errors.txt 2>&1
  8. キャッチされない例外のスタックトレースはファイルに保存され、静的なThread.setDefaultUncaughtExceptionHandlerメソッドを呼び出して、キャッチされない例外のハンドラーを変更できます
  9. クラスのロードプロセスを監視するには、-verboseフラグを使用してJava仮想マシンを起動します。
  10. -Xlintオプションは、一般的に起こりがちなコードの問題をチェックするようコンパイラーに指示します
    [外部リンクの画像転送が失敗しました。ソースサイトに盗難防止チェーンメカ​​ニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-Vg4mJ7vS-1582984683851)(evernotecid: // 1520493E-927F-420A-8EE1-BA6F74088A9D / appyinxiangcom / 11767354 / ENResource / p3065)]]
  11. JVMを使用してJavaアプリケーションを監視および管理する
    ためのJconsole processIDのサポート
  12. ヒープダンプを取得するためのjmapユーティリティ
    jmap -dump:format = b、file = dumpFileName processID
    jhat dumpFileName
    into localhost:7000
  13. -Xprofフラグを指定してJava仮想マシンを実行すると、基本的なプロファイラーが実行さ
    れ、コードで頻繁に呼び出されるメソッドが追跡されます

まとめ

この記事では、プログラムエラーの分類を整理し、Java言語は、特別な戻り値を返すだけでなく、例外オブジェクトをスローして例外をキャッチすることにより、プログラムの問題を処理できます。プログラムの実行中のビジネス情報とプログラム情報をさまざまなログレベルで記録し、アサーションを通じてプログラムの開発段階とテスト段階でプログラムの検出を実現します。

元の記事を159件公開 賞賛された225件 210,000回の閲覧

おすすめ

転載: blog.csdn.net/lyg673770712/article/details/104583090