一、try/catch/throw含义理解
因为程序运行着,可能会产生一些错误,这些错误并不是语法错误(语法错误编译器会识别提示),而是到了特定的操作就是产生。
所以需要引入try/catch/throw,
try相当于是监控区域,在try{}块里尝试着各种可能产生异常的调用。
当try里抛出了异常后,就需要catch处理这个异常,如果有多种异常,则可以写多个catch语句。
throw可以直接抛出/产生异常,导致控制流程转到catch块。主要应用于自定义异常
1.将当前捕获的异常再次抛出:throw e;
2.重新生成一个异常,并抛出:throw new Exception(“some message”);
3.重新生成并抛出一个新的异常,该异常包含了当前异常的信息:throws newException(“some message”,e); 然后用e.getCause()来得到内部异常
二、try/catch/throw语句书写
try{
throw value;
}
catch(valuetype v){
//处理异常
}
三、做出一个计算器除法功能,除以0时程序必须给出提示。
import java.util.Scanner;
public class temp {
public static void main(String[] args) {
double a,b,c;
System.out.println("请输入第一个数字:");
a=GetDouble(); //该方法会抛出非数字异常
System.out.println("请输入第二个数字:");
b= GetNonZeroDouble(); //该方法会抛出非数字异常和自定义数字不能0异常
c=a/b;
System.out.println(a+"/"+b+"="+c);
}
public static double GetDouble() {
double x;
try{
Scanner s=new Scanner(System.in);
x=s.nextDouble();
}catch (Exception e) {
System.out.println("输入非法,请输入数字:");
return GetDouble();
}
return x;
}
public static double GetNonZeroDouble() {
//此方法捕获两种异常,所以异常需确定顺序:子类型必须要在父类型之前进行catch。当MyException写在Exception后时,会报错:
//Unreachable catch block for MyException. It is already handled by the catch block for Exception
//catch与分支逻辑是一致,如果父类型先被catch,那么后被catch的分支根本得不到运行机会。
double x;
try{
Scanner s=new Scanner(System.in);
x=s.nextDouble();
if (x==0) {
throw new MyException("被除数不能为0");
}
}catch (MyException e) {
// TODO: handle exception
System.out.println("输入非法:"+e.getMessage()+",请输入非0数字:");
return GetDouble();
}catch (Exception e) {
// TODO: handle exception
System.out.println("输入非法,请输入非0数字:");
return GetDouble();
}
return x;
}
}
class MyException extends Exception{
public MyException(String message) {
super(message);
}
}