异常分为运行时异常和非运行时异常,所有异常类都会直接或者间接继承Exception
- 对于非运行时异常,必须要对其进行处理。处理方式有两种:第一种是使用try...catch...finally进行捕获;第二种是在调用该会产生一场的方法所在的方法生命throws exception,例如
IOException,FileNotFoundException
- 运行时异常是不需要捕获的,运行时异常都会直接或间接地继承自RuntimeException,例如 NullPointerException
自定义异常类
我们一般都会直接继承Exception类,一般不会继承某个运行时的异常类
public class MyException extends Exception { MyException() { super(); } /** * ex为抛出的具体异常 * @param ex */ MyException(String ex) { super(ex); } }
public class MyExceptionTest { public void isString(String s) throws MyException { if (null == s) { throw new MyException("param is null"); } } public static void main(String[] args) throws MyException { MyExceptionTest exTest = new MyExceptionTest(); try{ exTest.isString(null); } catch (MyException ex) { ex.printStackTrace(); } finally { System.out.println("入参为空"); } // 直接输出异常 new MyExceptionTest().isString(null); } }
异常原因:
1、用户输入了非法数据。
2、网络通信是连接中断
3、JVM内存溢出
我们可以使用多个catch块来捕获异常,这时需要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch可能被执行,否则子类型的catch将永远无法到达,java编译器会报编译错误;如果多个catch块的异常类型是独立的(MyException, MyException2),那么谁前谁后都是可以的。
如果try块中有retrun,则fianlly里面的代码会执行,如果执行system.exbit(0),那么就不会在执行finally块中的代码,因为会终止当前运行java虚拟机,程序会在虚拟机终止前结束执行