2019-05-28 Java学習日記の異常&IO(File類)

37921 ワード

異常
異常の概要と分類:
A:概要
異常とは、Javaが実行中に発生したエラーです。
B:分類
Err:
サーバーのマシン、データベースの崩壊など
Exception
C:継承体系
Throwable
エロエロ
Exception
RuntimeException
JVMデフォルトはどのように異常を処理しますか?
public class Demo1 {

    public static void main(String[] args) {
        Demo d = new Demo();
        int x = d.div(10, 0);
        System.out.println(x);
    }

}
class Demo{
    public int div(int a,int b){    //a = 10,b = 0;
        return a / b;                //10 / 0     10,   0,。    0             ,    
                                    //new ArithmeticException("/ by zero");
    }
}
 
この問題をメール関数で受信した場合、二つの処理方法があります。
a:自分でこの問題を処理して、引き続き実行します。
b:自分は対応していません。メールを呼んだjvmにだけ処理します。
jvmにはデフォルトの異常処理メカニズムがあり、この異常を処理します。
この異常の名称、異常の情報、異常が発生した位置をコンソールに印刷し、プログラムを停止します。
try…catchの方式は異常を処理します。
A:異常処理の2つの方法
a:try...catch...finally
try catch
try catch finally
try finally
b:throws
B:try...catch処理異常の基本フォーマット
try…catch…finally
C:デモ
public class Demo1 {

    public static void main(String[] args) {
        Demo d = new Demo();
        try {
            int x = d.div(10, 0);
            System.out.println(x);
        } catch (ArithmeticException a) {
            System.out.println("     0");
        }
        System.out.println("1111111");
        
    }

}
class Demo{
    public int div(int a,int b){    //a = 10,b = 0;
        return a / b;                //10 / 0     10,   0,。    0             ,    
                                    //new ArithmeticException("/ by zero");
    }
}
 
注:try...catchバーの問題が解決されたら、プログラムは継続します。
try…catchの方式は異常を処理します。
public static void demo1() {
        int a = 10;
        int b = 0;
        int[] arr = {11,22,33,44,55};
        
        try {
            System.out.println(a / b);
            System.out.println(arr[10]);
            arr = null;
            System.out.println(arr[0]);
        } catch (ArithmeticException e) {
            System.out.println("      ");
            
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("     ");
        } catch (Exception e) {                    //Exception e = new NullPointerException()
            System.out.println("   ");
        }
        System.out.println("over");
    }
 
try...catchの方式で複数の異常を処理する:
public class Demo2 {
    /**
     * try       catch,         ,       ,       ,
     *        ,            ,  catch      
     */
    public static void main(String[] args) {
//        demo1();
        int a = 10;
        int b = 0;
        int[] arr = {11,22,33,44,55};
        
        //JDk7        
        try {
            System.out.println(a / b);
            System.out.println(arr[10]);
        } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
            System.out.println("   ");
            
        }
    }
 
コンパイル期間異常と運転期間異常の違い:
A:違います
Javaの異常は二つの種類に分けられています。コンパイル時異常と運転時異常
すべてのRuntimeException類とそのサブクラスの例を運転時異常と呼びます。他の異常はコンパイル時異常です。
コンパイル時異常:
Javaプログラムは処理を表示しなければなりません。そうでなければ、プログラムにエラーが発生します。
運転時異常:
表示処理は不要です。コンパイル時の異常と同じ処理も可能です。
B:デモ
import java.io.FileInputStream;
    /**
     *      :          ,              ,        ,
     *                 ,          
     * 
     *      :        ,        
     *
     */
public class Demo4 {
    public static void main(String[] args) {
        try{
        FileInputStream fis = new FileInputStream("xxx.txt");
        } catch (Exception e) {
            
        }
    }
}
 
Throwbleのいくつかの一般的な方法:
A:よくある方法
a:get Message()
異常情報を取得し、文字列を返します。
b:toString()
異常クラス名と異常情報を取得し、文字列を返します。
c:print StockTrace()
異常クラス名と異常情報、およびプログラムに異常が発生した位置を取得します。voidに戻ります
B:デモ
public class Demo5 {

    public static void main(String[] args) {
        try {
            System.out.println(1/0);
        } catch (Exception e) {                        //Exception e = new ArithmeticException("/ by zero");
            //System.out.println(e.getMessage());    //      
            //System.out.println(e);                //  toString  ,           
            e.printStackTrace();                    //jvm            
        }
    }

}
 
thowsの方式は異常を処理します。
A:方式
機能方法を定義する場合は、問題が発生したことを暴露して使用者に処理させる必要があります。
それでは、thowsを通じて方法に表示します。
B:デモ
public class Demo6 {

    public static void main(String[] args){
        Person p = new Person();
        p.setAge(18);
        System.out.println(p.getAge());
    }

}

class Person {
    private String name;
    private int age;

    public Person() {
        super();
    }

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws RuntimeException {
        if (age > 0 && age <= 150) {
            this.age = age;
        } else {
            throw new RuntimeException("    ");
        }
    }

}
 
thowの概要とthowsの違い:
A:概要
機能方法の内部にある場合、プログラムは運転を継続できません。ジャンプが必要な場合は、throwを使って異常なオブジェクトを投げ出します。
B:違います
a:thows
方法で声明した後で、付いているのは異常類名です。
複数の異常類名とコンマで区切ることができます。
この方法の使用者によって処理されます。
b:throw
方法の体内で、とは異常対象名です。
例外オブジェクト名のみ
異常を投げかけて、方法の体内の文で処理することを表します。
finallyキーワードの特徴と役割:
A:特徴
finallyによって制御されるステートメントは必ず実行されます。
特殊な場合:finallyを実行する前にjvmは終了しました(例えばSystem.exit()。
B:作用
リソースを解放するために、IOフロー操作とデータベース操作で会います。
C:デモ
public class Demo7 {

    public static void main(String[] args) {
        try {
            System.out.println(10/0);
        }catch (Exception e) {
            System.out.println("      ");
            System.exit(0);                     //  jvm   
            return;
        }finally {
            System.out.println("  ");
        }
    }

}
 
finallyキーワードの面接問題:
A:finalとfinallyとfinalizeの違い
B:もしcatchにreturn文があれば、finallyのコードはまだ実行されますか?できるなら、リターンの前ですか?それともリターンの後ですか?
public class Test1 {
    /**
     * final,finally finalize   
     * final     ,     
     *     ,     
     *     ,      
     * 
     * finally try         ,      ,      
     * 
     * finalize     ,                     ,              
     * 
     * 
     */
    public static void main(String[] args) {
        Demoa d = new Demoa();
        System.out.println(d.method());
    }

}
class Demoa{
    public int method(){
        int x = 10;
        try {
            x = 20;
            System.out.println(1/0);
            return x;
        } catch (Exception e) {
            x = 30;
            return x;
        } finally {
            x = 40;
//            return x;            //     finally       ,  finally          ,       
                                //           ,  try catch        
        }
    }
}
 
カスタム異常の概要と基本使用:
A:なぜカスタム異常が必要ですか?
名前で何が異常なのかを区別します。解決方法があります。
B:カスタム異常の概要
Excpetionから継承
RuntimeExceptionから引き継ぎます。
C:デモ
異常な注意事項とどのように異常処理を使うか:
A:注意事項
a:子類の親類を書き換える方法においては、子類の方法は同じ異常または父類異常のサブクラスを投げ出しなければなりません。
b:父親がいくつかの異常を投げた場合、子類は父親類を書き直す時、同じ異常または彼のサブセットを投げ出すしかないです。子類は父親にない異常を捨てられません。
c:書き換えられた方法に異常がなければ、サブクラスの方法は絶対に例外を投げてはいけません。サブメソッド内に異常が発生したら、サブクラスはtryしかできません。throwsはできません。
B:異常処理の使い方
原則:もしこの機能の内部は問題を処理することができるならば、tryを使って、もし処理できないならば、使用者に任せて処理して、これはthrowsを使うのです。
違い:
後続のプログラムは継続して実行する必要があります。tryが必要です。
後続のプログラムは継続する必要がないので、throwsを使います。
JDKなら 対応の異常がありません。カスタム異常が必要です。
練習:
キーボードはintタイプの整数を入力して、バイナリ表現の形式を求めます。
入力した整数が大きすぎると、ヒントを与えます。入力した整数が大きすぎます。もう一度入力してください。
もし入力したのが小数点だったら、ヒントを与えて、入力したのは小数点以下です。もう一度整数を入力してください。
入力した文字が他の文字だったら、ヒントを与えます。入力したのは不法文字です。もう一度整数を入力してください。
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Scanner;

public class Test2 {
    /**
     *       int     ,                    ,    ,       ,         BigInteger
     *         ,    ,      ,                    ,    ,        ,         
     * 
     *   : 1、         2、           String       ,  int                ,        
     * 3、          int     ,          4、        5、          
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("       :");

        while (true) {
            String line = sc.nextLine();
            try {
                int num = Integer.parseInt(line);
                System.out.println(Integer.toBinaryString(num));
                break;
            } catch (Exception e) {
                try {
                    new BigInteger(line);
                    System.out.println("    ,           ,         :");
                } catch (Exception e1) {
                    try {
                        new BigDecimal(line);
                        System.out.println("    ,         ,         :");
                    } catch (Exception e2) {

                        System.out.println("    ,         ,         :");
                    }
                }
            }
        }
    }

}
 
 IO(File類)
Fileクラスの概要と構造方法:
A:概要
Fileはパスと呼ぶべきです。
ファイルパスまたはフォルダパス
パスは絶対パスと相対パスに分かれています。
絶対パスは固定パスです。ディスクから開始します。
相対パスはある位置に対して、eclipseでは現在のプロジェクトを指し、dosで
B:構造方法
File(String) パスによってFileオブジェクトを得る。
File(String) parent、String child):ディレクトリとサブファイル/ディレクトリからFileオブジェクトを得る
File(File) parent、String child):親Fileオブジェクトとサブファイル/ディレクトリからFileオブジェクトを得る。
C:デモ
package com.file;

import java.io.File;

public class Demo1 {

    public static void main(String[] args) {
        //demo1();
        //demo2();
        File parent = new File("E:\\music");
        String child = "   -  .mp3";
        File file = new File(parent,child);
        System.out.println(file.exists());
        System.out.println(parent.exists());
        
    }

    public static void demo2() {
        String parent = "E:\\music";
        String child = "   -  .mp3";
        File file = new File(parent,child);
        System.out.println(file.exists());
    }

    public static void demo1() {
        File file = new File("E:\\music\\   -  .mp3");
        System.out.println(file.exists());
        
        File file2 = new File("xxx.txt");
        System.out.println(file2.exists());
        
        File file3 = new File("yyy.txt");
        System.out.println(file3.exists());
    }

}
 
Fileクラスの作成機能:
A:作成機能
public bollan createNewFile():ファイルを作成するには、このようなファイルがあれば作成しません。
public book mkdir():フォルダを作成するには、このようなフォルダがあれば作成しません。
public bollan mkdirs():フォルダを作成すると親フォルダが存在しない場合、作成してくれます。
B:デモ
package com.file;

import java.io.File;
import java.io.IOException;

public class Demo2 {

    public static void main(String[] args) throws IOException {
        //demo1();
        File dir1 = new File("aaa");
        System.out.println(dir1.mkdir());
        
        File dir2 = new File("hhh.txt");            //           
        System.out.println(dir2.mkdir());
        
        File dir3 = new File("aaa\\bbb\\ccc");        //      
        System.out.println(dir3.mkdirs());
    }

    public static void demo1() throws IOException {
        File file = new File("yyy.txt");
        System.out.println(file.createNewFile());    //       ,  true
        
        File file2 = new File("hhh");
        System.out.println(file2.createNewFile());
    }

}
 
注意事項:
ファイルまたはフォルダを作成してディスクのパスを書き忘れたら、デフォルトはプロジェクトパスの下にあります。
Fileクラスの名前変更と削除機能。
A:名前の変更と削除機能
public bollan renname To(File) dest):指定されたファイルパスにファイルをリネームする
public bollan delete():ファイルまたはフォルダの削除
B:名前変更の注意事項
パス名が同じなら、名前を変えます。
パス名が違ったら、名前を変えて切り取ります。
C:削除の注意事項
Javaの中の削除はごみ箱を通りません。
フォルダを削除するには、このフォルダにファイルやフォルダが含まれていないことに注意してください。
package com.file;

import java.io.File;

public class Demo3 {
    public static void main(String[] args) {
        //demo1();
        File file1 = new File("yyy.txt");
        System.out.println(file1.delete());
        
        File file2 = new File("aaa");
        System.out.println(file2.delete());
        
        File file3 = new File("ccc");                //
        System.out.println(file3.delete());
    }

    public static void demo1() {
        File file1 = new File("aaa.txt");
        File file2 = new File("e:\\xxx.txt");
        System.out.println(file1.renameTo(file2));
    }
}
 
File類の判断機能:
A:判定機能
public bollan isDirectory():ディレクトリかどうかを判断する
public bollan isfile():ファイルかどうかを判断する
public bollan exists():存在するかどうかを判断する
public bollan canRead():読み取り可能かどうかを判断する
public bollan canWrite():書くかどうかを判断する
public bollan ishidden():隠蔽するかどうかを判断する
B:デモ
package com.file;

import java.io.File;

public class Demo4 {

    public static void main(String[] args) {
        //demo2();
        File file = new File("zzz");
        file.setReadable(false);
        System.out.println(file.canRead());        //windows              
        file.setWritable(true);
        System.out.println(file.canWrite());    //windows          
        
        File file2 = new File("aaa.txt");
        System.out.println(file2.isHidden());     //         
        System.out.println(file.isHidden());
    }

    public static void demo2() {
        File dir1 = new File("ccc");
        System.out.println(dir1.isDirectory());        //        
        
        File dir2 = new File("zzz");
        System.out.println(dir2.isDirectory());    
        
        System.out.println(dir1.isFile());            //           
        System.out.println(dir2.isFile());
    }

}
 
Fileの取得機能:
A:取得機能
public String get AbsoluutePath():絶対パスを取得する
public String getPath():取得経路
public String get Name():名前を取得する
public long length():長さを取得する バイト数
public long ラストModified():最後の変更時間を取得します。ミリ秒の値
public String[] リスト():指定されたディレクトリのすべてのファイルまたはフォルダの名前配列を取得します。
public File[] listFiles():指定されたディレクトリのすべてのファイルまたはフォルダのFile配列を取得します。
B:デモ
package com.file;

import java.io.File;
import java.sql.Date;
import java.text.SimpleDateFormat;

public class Demo5 {

    public static void main(String[] args) {
        //demo1();
        File dir = new File("E:\\javaStudy");
        String[] arr = dir.list();                //        
        
        for (String string : arr) {
            System.out.println(string);
        }
        
        File[] subFiles = dir.listFiles();
        
        for (File file : subFiles) {
            System.out.println(file);
        }
        
        
    }

    public static void demo1() {
        File file1 = new File("aaa.txt");
        File file2 = new File("E:\\javaStudy\\2019-05-28\\aaa.txt");
            
        System.out.println(file1.getAbsolutePath());    //          
        System.out.println(file2.getAbsolutePath());
        
        System.out.println(file1.getPath());            //            
        System.out.println(file2.getPath());
        
        System.out.println(file1.getName());            //           
        System.out.println(file2.getName());
        
        System.out.println(file1.length());
        
        Date d = new Date(file1.lastModified());        //        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM dd  HH:mm:ss");
        System.out.println(sdf.format(d));
    }

}
 
指定されたディレクトリの拡張子を指定するファイル名を出力します。
需要:Eディスクディレクトリに拡張子があるかどうかを判断します。jpgというファイルがあれば、そのファイル名を出力します。
package com.file;

import java.io.File;

public class Test {

    public static void main(String[] args) {
        File dir = new File("E:\\");
        
        /*String[] arr = dir.list();                //  e           
        for (String string : arr) {
            if (string.endsWith(".jpg")) {
                System.out.println(string);
            }
        }*/
        
        File[] subFiles = dir.listFiles();            //  E             
        
        for (File subFile : subFiles) {
            if (subFile.isFile() && subFile.getName().endsWith(".jpg")) {
                System.out.println(subFile);
            }
        }
    }

}
 
ファイル名フィルタの概要と使用:
A:概要
public String[] list(Filename Filter) ファイター
public File[] listFiles(FileFilter) ファイター
B:ファイル名フィルタの使用
需要:Eディスクディレクトリに拡張子があるかどうかを判断します。jpgというファイルがあれば、そのファイル名を出力します。
 
package com.file;

import java.io.File;
import java.io.FilenameFilter;

public class Test2 {

    public static void main(String[] args) {
        File dir = new File("E:\\");
        
        String[] arr = dir.list(new FilenameFilter() {
            
            @Override
            public boolean accept(File dir, String name) {
                File file = new File(dir,name);
                return file.isFile() && file.getName().endsWith(".jpg");
            }
        });
        
        for (String string : arr) {
            System.out.println(string);
        }
    }

}
 
転載先:https://www.cnblogs.com/clqbolg/p/10941564.html