try catch用于包含代码块,是指在当前方法中就处理异常
而Throws用于方法外部,表示将异常抛给方法的调用者,如果上层没有处理,就继续往上(上一层的调用者)抛,直到处理了异常,或者直到抛给JVM
下面用一个例子来说明区别
public class Test {
public static void main(String[] args) {
try {
test1(); //调用test1
} catch (Exception e) {
System.out.println("-----main方法使用try catch处理了异常-----");
// e.printStackTrace();
}
}
public static void test1() throws Exception {
test2(); //调用test2
}
public static void test2() throws Exception {
test3(); //调用test3
}
public static void test3() throws Exception { //将异常往调用者抛
System.out.println("-----test3"+"抛出了一个异常-----");
throw new Exception(); // 抛出一个异常
}
}
自定义异常
① 创建一个类,继承Exception类 (所有的异常类都继承自Throwable类)
public class TestException {
public static void main(String[] args) {
System.out.println(add(1.2));
}
public static int add(Object object){
if(object instanceof Integer){ // instanceof: 判断是否是该类型,这里是判断object是否是Integer类型
int num = (int) object; //将object转换成int
return ++num;
}
else {
String error="传入的参数不是整数类型";
MyException myException = new MyException(error);
try {
throw myException; // 抛出自定义异常
} catch (MyException e) {
System.out.println("抛出了自定义异常");
// e.printStackTrace();
}
return 0;
}
}
}
运行时异常与编译时异常
在Java中,异常分类有运行时异常和编译时异常,两者的不同处顾名思义,但其实还有更深层次的不同;
- 运行时异常
在Java中,有一个类RuntimeException用于检测运行时异常
当要标记一个异常是运行时异常时,那么就要继承RuntimeException这个父类,比如空指针异常、数组下标越界异常等;
运行时异常在编译的时候不会出错,但是程序运行时会报错
当运行时异常报错之后,如果没有try catch捕获,那么就会终止当前的线程
- 编译时异常
编译时异常不同于RuntimeException,一般是直接继承Exception类;
编译时异常需要在写代码的时候捕获,如果不捕获那么就不能编译通过;