/ *
- (例外がスローされるスロー、例外処理をスロー注)スロー:手動で例外をスロー
- 図1は、自動的に例外がシステムとスローによるプログラムの実行中に発生した場合を除き、生成するJavaの例外クラスのオブジェクト、投げる、また必要に応じて手動で作成することができます。
- 2つの最初のクラスはthrow文によって達成(Javaランタイム環境に提出)例外オブジェクト、その後、投げ操作を生成します。
- 例外はThrowableのかのサブクラスのインスタンスでスローされなければなりません。それ以外の場合は、構文エラーを生成します。
- 典型的には、例外の使用、より少ない他の状況が続くのRuntimeExceptionを、使用。
- カスタム例外クラス:
- 1、ユーザ定義のクラスはのRuntimeExceptionのサブクラスです。
- 図2は、一般的に過負荷にカスタム例外クラスのコンストラクタの書き込みがいくつか必要です。
- 3、カスタム例外を提供する必要性のserialVersionUID
- 4、スローによってスローされた例外の定義から。
- 例外は、例外タイプは、名前に基づいて決定することができ、発生した場合に5は、カスタム例外は、最も重要なクラスの例外の名前です。
* /
package exception;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Exception_Throw {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Worker w = new Worker();
for(;;) { //通过for循环,持续输入数据,直到数据合法不抛出异常,则会break跳出循环
try {
System.out.println("请输入工资");
int num = scan.nextInt();
w.getPay(num);//出现异常会跳转到catch中,break不会执行。
System.out.println(w);
break;//不出异常,执行到break,跳出循环,取得正常数据
} catch (InputMismatchException e) {
System.out.println(e.getMessage());
System.out.println("请重新输入");
} catch (RuntimeException e) {
System.out.println(e.getMessage());//getMessage()方法返回的String数据就是手动创建异常对象时,输入的语句
System.out.println("请重新输入");
}
}
for(;;) {
try {
System.out.println("请输入今天的得分");
int num = scan.nextInt();
w.setScore(num);
System.out.println("今天的得分是" + w.score);
break;
} catch (InputMismatchException e) {
System.out.println(e.getMessage());
System.out.println("请重新输入");
}
catch (NumberOutOfBoundsException e) {
System.out.println(e.getMessage());
System.out.println("请重新输入");
}
}
for (; ;) {
//练习,两个数字相除的异常处理
try {
System.out.println("请输入分子");
int a = scan.nextInt();
System.out.println("请输入分母");
int b = scan.nextInt();
int c = ecm(a, b);
System.out.println(a + "除以" + b + "等于" + c);
break;
} catch (InputMismatchException e) {
System.out.println("数据类型错误,请重新输入");
} catch (NegativeNumberException e) {
System.out.println(e.getMessage());
System.out.println("请重新输入");
} catch (ArithmeticException e) {
System.out.println("分母不能为0 ,请重新输入");
}
}
System.out.println("-----------");
}
public static int ecm(int i,int j) throws NegativeNumberException {
if(i < 0 || j < 0) {
throw new NegativeNumberException("输入数据不能为负数") ;
}
return i / j;
}
}
class Worker{
int score;
int salary;
static int minSalary = 2000;
void getPay(int i){//这里的throws是处理异常
if(i >= minSalary) {
salary = i;
}else {
//System.out.println("数据非法");//如果不加throw依然会被赋值
//throw new String("数据非法");//抛出的异常必须是Throwable或其子类的实例
throw new RuntimeException("低于法定最低工资,数据非法");//这里的throw是抛出异常
}
}
@Override
public String toString() {
return "Worker [salary=" + salary + "]";
}
void setScore(int i){
if(i >= 0 && i <= 100) {
score = i;
}else {
throw new NumberOutOfBoundsException("数据范围必须在0-100之间");
}
}
}
class NumberOutOfBoundsException extends RuntimeException{
static final long serialVersionUID = 13265653435L;
public NumberOutOfBoundsException(){
super();
}
public NumberOutOfBoundsException(String message) {
super(message);
}
}
class NegativeNumberException extends Exception{
static final long serialVersionUID = 1365653435L;
public NegativeNumberException(){
super();
}
public NegativeNumberException(String message) {
super(message);
}
}