blog

JavaSE 第14話:共通API、例外

コア概要:これはまだツールクラスMath、任意精度整数クラス、特大浮動小数点データのいくつかの基本的な数学演算に使用される一般的に使用されるAPIを、学び続けるでしょう、加えて、プログラム開発の過程で...

Apr 13, 2020 · 16 min. read
シェア

コアの概要:この記事では、ツールクラスMathのいくつかの基本的な数学的操作、整数BigIntegerクラスの任意の精度、大きな浮動小数点データBigDecimalのために使用される一般的に使用されるAPIを、引き続き学習します;加えて、プログラム開発の過程で、多くの場合、例外の様々な遭遇するので、この記事も理解し、Javaで例外に対処することを学びます!この記事では、我々はまた、javaの例外を認識し、対処することを学びます。

Mathクラス

-概要

java.lang.Mathクラスには、プリミティブな絶対値や丸めなどの基本的な数学演算を実行するためのメソッドが含まれています。すべてのメソッドが静的でオブジェクトが生成されないこれらのようなツールクラスは、呼び出しが非常に簡単です。

-共通メソッド

メソッド

コード

 public static void main(String[] args) {
 System.out.println(Math.abs(-100)); // 100
 System.out.println(Math.ceil(10.1)); // 11.0
 System.out.println(Math.floor(10.1)); // 10.0
 }

BigIntegerクラス

-概要

java.math.BigIntegerクラスは、任意の精度の不変整数。操作は、データの範囲はlong型の後に、BigIntegerクラスの実装を使用することができます場合は、整数の計算のクラスは、長さに限定されません。

-コンストラクタ

BigInteger(String value) BigIntegerの10進文字列表現をBigIntegerに変換します。long型の範囲を超えると、もはや数値とは呼べないため、コンストラクタ・メソッドでは、非常に大きな整数の文字列表現を使用して、非常に大きな整数をBigIntegerオブジェクトにカプセル化します。

-共通メソッド

メソッド

コード

public static void main(String[] args){
 BigInteger big1 = new BigInteger("987654321123456789000");
 BigInteger big2 = new BigInteger("123456789987654321");
 //追加操作
 BigInteger add = big1.add(big2);
 System.out.println(" :"+add);
 //引き算操作
 BigInteger sub = big1.subtract(big2);
 System.out.println(" :"+sub);
 //乗算操作
 BigInteger mul = big1.multiply(big2);
 System.out.println(" :"+mul);
 //分割操作
 BigInteger div = big1.divide(big2);
 System.out.println(" :"+div);
}

BigDecimalクラス

-概要

java.math.BigDecimal不変で、任意の精度の符号付き10進数を表すクラス。このクラスは、非常に大きな浮動小数点データに対する厳密な演算を可能にします。

-コンストラクタ

BigDecimal(String value)BigDecimal関数は、BigDecimalの10進数文字列表現をBigDecimalに変換します。

-共通メソッド

メソッド

divide

  • BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
    • 除数: この BigDecimal で除算する値。
    • scale予約番号
    • roundingMode丸めメソッド
  • 丸め: BigDecimal クラスには、丸めメソッドを表す静的メンバ変数があります。
    • BigDecimal.ROUND_UP 1つ上に追加。
    • BigDecimal.ROUND_DOWN 直接丸め。
    • BigDecimal.ROUND_HALF_UP 丸め。

コード

public static void main(String[] args){
 BigDecimal big1 = new BigDecimal("5.25");
 BigDecimal big2 = new BigDecimal("3.25");
 //追加計算
 BigDecimal add = big1.add(big2);
 System.out.println(" :"+add);
 //引き算の計算
 BigDecimal sub = big1.subtract(big2);
 System.out.println(" :"+sub);
 //乗算計算
 BigDecimal mul = big1.multiply(big2);
 System.out.println(" :"+mul);
 //除算
 BigDecimal div = big1.divide(big2,2,BigDecimal.ROUND_HALF_UP);
 System.out.println(div);
}

第4章 パッケージング・クラスの基本タイプ

-概要

Javaは2つの型システム、基本型と参照型を提供し、基本型の使用は、効率にあるが、しかし、多くの場合、オブジェクトを使用するオブジェクトを作成するため、オブジェクトのような操作の基本型をしたい場合は、より多くの関数を行うことができます、次のように、対応するラッパークラスの基本型を使用することができます:

-Integer

概要

元の int 型の値をオブジェクトにラップします。コンストラクタと静的メソッドは以下のとおりです:

コード

public static void main(String[] args) {
 //public Integer(int value)テスト:int値に基づいてIntegerオブジェクトを作成する
 Integer i1 = new Integer(100);
 System.out.println(i1);
 //public Integer(String s)文字列値に基づいて整数オブジェクトを作成する。
 Integer i2 = new Integer("100");
 //Integer i2 = new Integer("abc"); //NumberFormatException
 System.out.println(i2);
 System.out.println("--------");
 //public static Integer valueOf(int i)指定されたint値を表すIntegerインスタンスを返す。
 Integer i3 = Integer.valueOf(100);
 System.out.println(i3);
 //public static Integer valueOf(String s)指定された値を保持するIntegerオブジェクトを返す。
 Integer i4 = Integer.valueOf("100");
 System.out.println(i4);
}

-ロードとアンロード

基本型とそれに対応するラッパークラスオブジェクトの間を行ったり来たりする変換プロセスは、「ボックス化」と「アンボックス化」と呼ばれます:

  • パッキング:基本型からパッキング・クラスの対応するオブジェクトに変換します。
  • アンボクシング:ラッパークラスオブジェクトから対応する基底型への変換。

例としてintを使ったIntegerを使います:

基本値 ---->ラッピングされたオブジェクト

Integer i = new Integer(4);//コンストラクタ関数を使用する
Integer iii = Integer.valueOf(4);//ラッパークラスのvalueOfメソッドを使う

パッケージオブジェクト ----> 基本値

int num = i.intValue();

-オートボクシングとアンボクシング

基本型とラッパークラスの間の変換を行う必要があることが多いので、Java 5以降では、ボックス化とアンボックス化のアクションの基本型とラッパークラスを自動的に行うことができます。例えば

Integer i = 4;//オートボックス。整数iに相当する= Integer.valueOf(4);
i = i + 5;//等号の右側:iオブジェクトを基本値iに変換する。.intValue() + 5;
//追加操作が完了した後、再度ボックス化し、ベース値をオブジェクトに変換する。

-基本型から文字列への変換

基本型を文字列に変更

変換方法:

  • 方法1:数字の直後に空文字列を追加
  • 方法 2: String クラスの静的メソッド valueOf() を使用します。

サンプルコード

public static void main(String[] args) {
 //int --- String
 int number = 100;
 // 
 String s1 = number + "";
 System.out.println(s1);
 // 
 //public static String valueOf(int i)
 String s2 = String.valueOf(number);
 System.out.println(s2);
}

String基本型の変換

Characterクラスを除いて、すべてのラッパークラスは文字列引数を対応する基本型に変換するparseXxx静的メソッドを持っています:

  • public static byte parseByte(String s)文字列引数を対応するバイト基本型に変換します。
  • public static short parseShort(String s)文字列引数を対応するshort base型に変換します。
  • public static int parseInt(String s)文字列引数を対応する int 基本型に変換します。
  • public static long parseLong(String s)文字列引数を対応する long base 型に変換します。
  • public static float parseFloat(String s)文字列引数を対応する浮動小数点基底型に変換します。
  • public static double parseDouble(String s)文字列引数を対応する double base 型に変換します。
  • public static boolean parseBoolean(String s)文字列の引数を対応する真偽値の基本型に変換します。

コード

public class Demo18WrapperParse {
 public static void main(String[] args) {
 int num = Integer.parseInt("100");
 }
}

例外の認識

-例外とは

異常とは、正常ではないという意味。生活の中で:医師が「体の一部に異常がある」「その部分は正常とは少し違う」「その部分の機能に影響がある」と言うこと。手術では

  • 例外: プログラムの実行中に発生する異常な状況を指し、最終的にはJVMの異常停止につながります。

Javaのようなオブジェクト指向プログラミング言語では、例外自体がクラスであり、例外を発生させることは、例外オブジェクトを作成してそれを投げることです。

構文が間違っていればコンパイルは通らず、バイトコード・ファイルは生成されず、実行もされません。

-例外システム

Javaでは、プログラムの正常な実行を維持するために、例外を処理するための例外メカニズムが用意されています。

Javaが提供する例外メカニズムでは、java.lang.Throwableがルートクラスで、その派生クラスにはjava.lang.Errorとjava.lang.Excepitonの2つのサブクラスがあります。

エラー、エラー、この種の例外はプログラムでは処理できませんが、可能な限り回避するしかありません。

Excepitonはコンパイル時の例外で、このタイプの例外はプログラム内で処理されます。Excepiton タイプにはRunTimeException というサブクラスもあり、これは実行時の例外を表します。

上記の例外の分類をより明確に区別するために、次の手順を見てください。

// Error 
// Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
// メモリー・オーバーフロー。割り当てられたJVMメモリ・サイズを超えた。
// プログラムは、問題を解決するためにソースコードを修正することしかできない。
int[]nums = new int[1024*1024*1024];
// Exception 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// Unhandled exception: java.text.ParseException
// この例外は、ソースコードが記述されるときに発生し、関連する処理メカニズムによって処理および回避できる。
Date date = format.parse("2083-10-10"); 
// RunTimeException 
int[] nums = {1,2,3};
// Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
// 配列の添え字を超えたときにプログラム実行時に発生する例外。この例外は、関連する例外メカニズムで処理できる。
System.out.println(nums[4]);

-例外発生のプロセス

プログラミングにおいて、例外をよりうまく扱うためには、まず例外が発生するプロセスを理解する必要があります。以下は、例外コードの一部を通しての分析です。

要件とコード

 // 要件:指定された配列の指定された位置にある要素を取得するメソッドを定義する。
 public static void main(String[] args) {
 int[]nums = {1,2,3};
 System.out.println(getElement(nums,4));
 }
 public static int getElement(int[]arr,int index){
 return arr[index];
 }

分析

  • getElementメソッドの実行中に、JVMは配列インデックスの境界外例外を検出し、その時点でJVMは2つの処理を行います:

    • 例外に関する情報を含むArrayIndexOutOfBoundsExceptionオブジェクトを作成します。
    • getElmentメソッドには例外処理がないため、JVMはgetElmentメソッドのcall-mainメソッドに例外オブジェクトをスローします。
  • mainメソッドはArrayIndexOutOfBoundsException例外オブジェクトを受け取り、例外を処理せず、例外オブジェクトをJVMにスローします。

  • JVMはmainメソッドを受け取ると、2つのことを行います:

    • コンソールへの例外メッセージの表示
    • プログラムの実行を終了

図解

例外処理

-例外キーワード

  • try
  • catch
  • finally
  • throw
  • throws

-スロー

概要

プログラムを書くときには、プログラムがうまくいかない状況を考えることが重要です。例えば、メソッドを定義するとき、メソッドはパラメータを受け入れる必要があります。そして、受け付けたパラメータを使用するメソッドが呼び出されたとき、まず最初に行うべきことは、パラメータデータの適法判定を行い、適法なデータでない場合は、適法なデータを渡すように呼び出し元に伝えることです。このとき、例外を投げる方法を使って呼び出し元に伝える必要があります。

javaでは、指定した例外オブジェクトを投げるためにthrowキーワードが用意されています。では、例外のスローは具体的にどのように行われるのでしょうか?

  1. 例外オブジェクトを作成します。ヒントをカプセル化します。
  2. この例外オブジェクトを呼び出し側に通知する必要があります。どのように知らせるのですか?例外を呼び出し側に伝えるにはどうすればいいのでしょうか?それはキーワード throw でできます。
    • throwはメソッド内で例外オブジェクトをスローし、例外オブジェクトを呼び出し元に渡し、現在のメソッドの実行を終了するために使用します。

フォーマットの使用

throw new 例外クラス名;

コードデモ

public static void main(String[] args) {
 //配列を作成する
 int[] arr = {2,4,52,2};
 //インデックスに従って対応する要素を見つける
 int index = 4;
 int element = getElement(arr, index);
 System.out.println(element);
 System.out.println("over");
}
 /*
 * インデックスで配列の該当要素を見つける
 */
public static int getElement(int[] arr,int index){ 
 //インデックスが範囲外かどうかを判断する
 if(index<0 || index>arr.length-1){
 /*
 条件が満たされ、throwの実行後にメソッドが操作を続行できなくなったかどうかを判断する例外オブジェクトを投げる。
 これは、現在のメソッドの実行を終了し、呼び出し元に例外を通知する。このとき、例外を解決する必要がある。
 */
 throw new ArrayIndexOutOfBoundsException("おい、コーナーマーカーが圏外だ~~~");
 }
 int element = arr[index];
 return element;
}

注:問題が発生した場合、throwは問題記述クラス、つまり例外をスローします。つまり、メソッドの呼び出し元に問題を返します。

では、呼び出し側がこの問題を処理する最善の方法は何でしょうか?もうひとつは、先に問題を宣言してthrows文を使って処理する方法です。

-例外のスローを宣言します。

宣言された例外とは

問題を特定し、呼び出し元に報告します。もしコンパイル時の例外がメソッド内でthrowsによってスローされ、キャッチされ処理されない場合は、呼び出し元が処理できるようにthrowsで宣言しなければなりません。

throwsキーワードはメソッド宣言で使用され、現在のメソッドが例外を処理しないことを示します。

例外フォーマットの宣言

修飾子 返り値 タイプ メソッド名 throws 例外クラス名 1,Exception クラス名 2...{ }	

例外を宣言するコードデモ

public static void main(String[] args) throws FileNotFoundException {
	read("a.txt");
}
// 関数の定義時に問題が発生した場合、呼び出し側に報告する必要がある。これは、メソッドのthrowsキーワードを使って宣言することができる。
public static void read(String path) throws FileNotFoundException {
	if (!path.equals("a.txt")) {//もし.txtこのファイル
		// もし.txt Think This file does not existはエラー、つまり例外がスローされる。
		throw new FileNotFoundException("ファイルが存在しない");
	}
}

もしメソッドが複数の例外を発生させる可能性がある場合、throws の後にカンマ区切りで複数の例外クラスを書くことができます。

public static void main(String[] args) throws IOException {
	read("a.txt");
}
public static void read(String path)throws FileNotFoundException, IOException {
	if (!path.equals("a.txt")) {//もし.txtこのファイル
		// もし.txt Think This file does not existはエラー、つまり例外がスローされる。
		throw new FileNotFoundException("ファイルが存在しない");
	}
	if (!path.equals("b.txt")) {
		throw new IOException();
	}
}

-例外のキャッチ try...catch

throwsで宣言された例外の欠点は、例外に続くコードが実行できないことです。

try-catchは、呼び出し元が例外を処理し、後続のプロシージャの実行を継続することを可能にします。

try...catch

try{
 例外を投げる可能性のあるコードを書く
}catch(例外タイプe){
 例外を処理するコード
 //例外のログ記録/例外メッセージの表示/例外のスローの継続
}

例外情報の入手方法

Throwableクラスは、閲覧用のメソッドを多数定義しています。

  • public String getMessage():例外の説明、原因を取得(ユーザーにプロンプトが表示された場合、エラーの原因がプロンプト表示されます。

  • public String toString()例外の種類と例外の説明情報を取得します。

  • public void printStackTrace()例外のトレーススタック情報を表示し、コンソールに出力します。

例外の種類、例外の原因だけでなく、開発およびデバッグフェーズでは、printStackTraceを使用する必要があります例外の場所が含まれています。

コードデモ

 // 要件:ファイルを読み込むメソッドを定義し、ファイルのパスとサフィックスを検出する。
 public static void main(String[] args) {
 try{
 retFile("d.txt");
 }catch (Exception e) {
 e.printStackTrace();
 }
 System.out.println("フォローアップコード");
 /*
 実行結果:
 	java.io.IOException: ファイル・パス・エラー
 at it.leilei.demo01.Main01.retFile(Main01.java:27)
 at it.leilei.demo01.Main01.main(Main01.java:12)
 フォローアップコード
 */
 }
 // ファイルを読み込むメソッド
 private static void retFile(String path) throws IOException {
 // サフィックスが.txt 
 if(!path.contains(".txt")){
 throw new FileNotFoundException("ファイル拡張子が.txt");
 }
 if(!path.contains("c:")) {
 throw new IOException("ファイル・パス・エラー");
 }
 }

-finally

finallyブロックを使う理由

finally:例外が発生するかどうかに関係なく実行する必要がある特定のコードがあります。また、例外は、プログラムのジャンプをトリガするため、その結果、いくつかのステートメントを実行することはできません。そして最後に、この問題を解決するために、最終的にコードブロックに格納されているコードが実行されることを確認しています。

コードが最終的に実行されなければならないとき

トライブロック内で物理リソースを開いた場合、使い終わったら最終的に閉じなければなりません。

構文フォーマット

try{
 例外を投げる可能性のあるコードを書く
}catch(例外タイプe){
 例外を処理するコード
 //例外のログ記録/例外メッセージの表示/例外のスローの継続
}
...
finally{
 //  
}

コードデモ

// 要件:ファイルを読み込むメソッドを定義し、ファイルのパスとサフィックスを検出する。
 public static void main(String[] args) {
 try{
 retFile("d.txt");
 }catch (Exception e) {
 e.printStackTrace();
 }finally {
 System.out.println("リソースの解放");
 }
 System.out.println("フォローアップコード");
 }
 // ファイルを読み込むメソッド
 private static void retFile(String path) throws IOException {
 // サフィックスが.txt 
 if(!path.contains(".txt")){
 throw new FileNotFoundException("ファイル拡張子が.txt");
 }
 if(!path.contains("c:")) {
 throw new IOException("ファイル・パス・エラー");
 }
 }

-例外の注意事項

注意事項

  • ランタイム例外は処理されずにスローされます。つまり、キャッチされなかったり、スローが宣言されなかったりします。

  • 親クラスが複数の例外をスローする場合、子クラスが親クラスのメソッドをオーバーライドすると、同じ例外またはそのサブセットしかスローできません。

  • 親メソッドが例外をスローすることはなく、子クラスが親メソッドをオーバーライドしても例外をスローすることはありません。子クラスが例外をスローする場合、それはキャッチされるだけで、スローを宣言することはできません。

  • 複数の例外が処理される場合、catchが処理され、前のクラスは次のクラスの親になることはできません。

  • try/catchの後にはfinallyブロックが続くことがあります。

  • catchを使用した複数の例外についてはどうですか?

    1. 複数の例外は別々に処理されます。
    2. 複数の例外は一度だけキャッチされ、複数回処理されます。
    3. 複数の例外はキャッチされ、1つずつ処理されます。

複数の例外に対する一般的なメソッド

try{
 例外を投げる可能性のあるコードを書く
}catch(例外タイプ A e){ tryでA型の例外が発生したら、次のcatchでキャッチする。.
 例外を処理するコード
 //例外のログ記録/例外メッセージの表示/例外のスローの継続
}catch(例外タイプ B e){ tryでB型例外が発生したら、次のcatchでキャッチする。.
 例外を処理するコード
 //例外のログ記録/例外メッセージの表示/例外のスローの継続
}

カスタム例外クラス

なぜカスタム例外クラスなのか

Javaの異なる例外クラスは、それぞれ言った、特定の例外を表し、その後、いくつかの例外の開発では、SUNは常に例外クラスを定義するために、独自のビジネス例外によると、この時間は、良いを定義していませんでした。たとえば、負の問題の年齢、負のテストのスコアなど。

カスタム例外クラスとは

開発中のビジネス例外に応じて例外クラスを定義します。

登録例外クラス RegisterException。

例外クラスの定義方法

  1. コンパイル時例外のカスタマイズ:クラスをカスタマイズし、java.lang.Exception.Exceptionを継承します。
  2. 実行時例外クラスのカスタマイズ:カスタムクラスで、java.lang.RuntimeExceptionを継承します。

コードデモ

要件:登録操作をシミュレートし、ユーザー名がすでに存在する場合、例外をスローし、プロンプト:pro、ユーザー名が登録されました。

カスタム例外クラス:

public class RegisterException extends Exception{
 public RegisterException(){
 super();
 }
 public RegisterException(String message){
 super(message);
 }
}

テスト:

 public static void main(String[] args) {
 // ユーザーの登録ユーザー名を受け取る
 String name = new Scanner(System.in).next();
 try{
 check(name);
 }catch (RegisterException e){
 e.printStackTrace();
 return;
 }
 System.out.println("登録成功");
 }
 public static void check(String n) throws RegisterException{
 String[]users={"ZhangSan"、"LiSi"、"WangWu"};
 for (int i = 0; i < users.length; i++) {
 if (n.equals( users[i])) {
 throw new RegisterException("pro、ユーザー名はすでに登録されている");
 }
 }
 }
 

Read next

ポップアップウィンドウの外側をクリックして閉じる

&lt;div class="box"&gt;\n &lt;div class="content" style="width: 200px; height: 350px; border: 1px sol

Apr 13, 2020 · 1 min read