異常な
1.
例外の概念とシステム例外:プログラムの実行中に発生し、最終的にJVMの異常停止につながる異常な状況
スロー可能なシステム:
エラー:重大なエラー、処理できないエラー
例外:例外、プログラム例外の後、オペレーターはコードを使用してプログラムを実行し続けるように修正できます。
2.例外処理
例外をスローするスロー
関数:
指定されたメソッドで指定された例外をスローする
構文:
throw new xxxException;
注:1。throw
キーワードはメソッド内に記述する必要があります。2。throwキーワードの
後の新しいオブジェクトはExceptionまたはExceptionのサブクラスである必要があります。オブジェクト
3.Throwキーワードは、指定された例外オブジェクトをスローします。この例外オブジェクトを処理する必要があります
public class Demo01 {
public static void main(String[] args) {
int[] array=null;
int e=getElement(array,0);
System.out.println(e);
}
public static int getElement(int[] array,int index){
if(array==null){
throw new NullPointerException("传递数组为空");
}
int res=array[index];
return res;
} //运行期异常,默认交给JVM处理
}
3.例外の宣言は例外の宣言をスローし
ます:問題を特定し、それを呼び出し元に報告します。メソッドがthrowを介してコンパイル時例外をスローするが、例外をキャッチしない場合は、throwsを介して宣言し、呼び出し元に処理させる必要があります。
構文:
修飾子の戻り値タイプメソッド名(パラメーター)は例外クラス名1 {をスローします。 }
注:
1メソッド宣言に書き込まれなければならないキーワード.throws
2.キーワードが例外または例外のサブクラスである必要がありスロー後に宣言された例外
複数の例外オブジェクトをメソッド内にスローされた場合3.次に複数の例外もある必要がありますスロー後に宣言;スローされた複数の例外オブジェクトに子と親の関係がある場合は、親例外を直接宣言でき
ます。4。例外のスローを宣言するメソッドを呼び出す
場合は、宣言された例外を処理するか、スローを引き続き使用する必要があります。スローするステートメント、メソッドの呼び出し元に処理を渡し、最後にJVMに渡す
か、... catchを実行して例外を単独で処理します
public class Demo02 {
public static void main(String[] args) throws FileNotFoundException {
readFile("c:\\a.txt");
}
public static void readFile(String fileName) throws FileNotFoundException{
if(!fileName.equals("c:\\a.txt")){
throw new FileNotFoundException("传递路径不是c:\\a.txt");
}
System.out.println("路径没有问题,读取文件");
}
}
4.例外をキャッチしますtry ... catch
例外が発生した場合、プログラムはすぐに終了するため、例外を処理する必要があります
。1。メソッドはそれを処理せず、メソッドの呼び出し元が処理します(スローします)。
2.メソッドStatementsでtry ... catchを使用して、例外を処理します。例外を
キャッチします。JAVAは、対象のステートメントをキャプチャし、指定された方法で例外を処理できます。
構文:
try {異常な可能性のあるコード
} catch(例外タイプe){}
例外を処理するためのコード
}
注:
1。tryで複数の例外オブジェクトがスローされる場合があり、複数のキャッチを使用してこれらの例外オブジェクトを処理できます。2。tryで
例外が発生した場合、catchの例外処理ロジックはの処理ロジックは、try ... catchの後もコードの実行を続行します。tryに例外がない場合、catchの処理ロジックは実行されず、次の手順を実行します。 try ... catchの後にコードを実行します
public class Demo02 {
public static void main(String[] args){
try{
readFile("c:\\d.txt");
}catch(FileNotFoundException e){
System.out.println("传递文件路径错误");
}
}
public static void readFile(String fileName) throws FileNotFoundException {
if(!fileName.equals("c:\\a.txt")){
throw new FileNotFoundException("传递路径不是c:\\a.txt");
}
System.out.println("路径没有问题,读取文件");
}
}
一部の表示メソッドは、Throwableクラスで定義されています。publicStringgetMessage():例外の説明を取得し
ます
public String toString():例外のタイプと説明を取得します
public void printStackTrace():例外のスタックトレースを出力しますコントロールステーションに出力します
public class Demo04 {
public static void main(String[] args){
try{
readFile("c:\\d.txt");
}catch(FileNotFoundException e){
System.out.println(e.getMessage()); //传递路径不是c:\a.txt
System.out.println(e.toString()); //java.io.FileNotFoundException: 传递路径不是c:\a.txt
e.printStackTrace(); //全面信息
}
}
public static void readFile(String fileName) throws FileNotFoundException {
if(!fileName.equals("c:\\a.txt")){
throw new FileNotFoundException("传递路径不是c:\\a.txt");
}
System.out.println("路径没有问题,读取文件");
}
}
5.最後にコードブロック
例外が発生するかどうかに関係なく実行する必要のある特定のコードがいくつかあります。
注:
1.finallyを単独で使用することはできません
。2.finallyは通常リソースリリースに使用されます。
構文:
try ... catch。 ..最終的に
public class Demo03 {
public static void main(String[] args){
try{
readFile("c:\\d.txt");
}catch(FileNotFoundException e){
System.out.println(e.getMessage()); //传递路径不是c:\a.txt
}
finally{
System.out.println("资源释放");
}
}
public static void readFile(String fileName) throws FileNotFoundException {
if(!fileName.equals("c:\\a.txt")){
throw new FileNotFoundException("传递路径不是c:\\a.txt");
}
System.out.println("路径没有问题,读取文件");
}
}
子親クラス例外:
親クラスが複数のフィールドをスローする場合、子クラスが親クラスメソッドをオーバーライドすると、親クラスまたは親クラス例外のサブクラスと同じ例外がスローされるか、例外がスローされない
場合は例外がスローされません。親クラスは例外をスローしない場合、サブクラスは親クラスのメソッドをオーバーライドするときに例外をスローできません。現時点では、サブクラスはメソッドがオーバーライドされた場合にのみ例外をキャプチャして処理できます。6。
カスタム例外はできません。宣言すること。
注:
例外で1.カスタム例外は、一般的に、すべてのエンドそれらは
2.カスタム例外クラスが例外またはRuntimeExceptionを継承しなければなりません
継承例外:その後、独自の例外クラスは、コンパイル時の例外であるコンパイル時の例外が内側にスローされた場合。メソッド、例外を処理するか、スローするtry ... catchは
RuntimeExceptionを継承します。カスタム例外クラスはランタイム例外であり、処理する必要はなく、仮想マシンに渡されます。
public class RegisterException extends Exception{
public RegisterException(){
super();
}
public RegisterException(String message){
super(message);
}
}
public class Demo05 {
static String[] usernames={
"Kobe","James","Jordan"};
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名:");
String username=sc.next();
checkUsername(username);
}
public static void checkUsername(String username){
for (String s : usernames) {
if(s.equals(username)){
try {
throw new RegisterException("用户已经被注册!");
} catch (RegisterException e) {
e.printStackTrace();
return;
}
}
}
System.out.println("注册成功!");
}
}