疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java基础:异常处理


 

  一、常见的异常类型:

  public class TestException {

  public static void main(String[] args) {

  int i = 10;

  //数学异常: java.lang.ArithmeticException

  int j = i / 0;

  System.out.println(j);

  int [] scores = new int[]{1, 2, 4, 5};

  //数组下标越界异常: java.lang.ArrayIndexOutOfBoundsException

  System.out.println(scores[4]);

  Person p1 = new Man();

  //类型转换异常: java.lang.ClassCastException

  Woman p2 = (Woman) p1;

  p1 = null;

  //空指针异常: java.lang.NullPointerException

  System.out.println(p1.toString());

  System.out.println("end...");

  }

  }

  class Person{

  }

  class Man extends Person{

  }

  class Woman extends Person{

  }

  二、不论在try、catch代码块中是否发生了异常事件,finally块中的语句都会被执行。

  import java.io.FileNotFoundException;

  import java.io.InputStream;

  public class TestTryCatchFinally {

  public static void main(String[] args) {

  try {

  int i = 10;

  int j = i / 0;

  } finally{

  System.out.println("finally...");

  }

  //不论在try、catch代码块中是否发生了异常事件,finally块中的语句都会被执行。

  System.out.println("end...");

  //示例编译时异常, IO 异常属于编译时异常.

  try {

  InputStream is = new FileInputStream("abc.txt");

  } catch (FileNotFoundException e) {

  e.printStackTrace();

  }

  }

  }

  三、throws:

  1. 在 Java 中使用 throws 关键字声明抛出异常.

  2. throws 方法抛出的异常可以是方法中出现的异常的类型或其父类类型.

  3. throws 可以声明抛出多个异常, 多个异常使用 , 分割.

  4. 运行时异常不需要使用 throws 关键字进行显式的抛出.

  5. 重写方法不能抛出比被重写方法范围更大的异常类型.

  import java.io.FileNotFoundException;

  import java.io.IOException;

  public class TestThrows {

  public static void main(String[] args) {

  try {

  test();

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  public static void test(){

  int i = 10 / 0;

  System.out.println(i);

  // InputStream fs = new FileInputStream("abc.txt");

  // Connection connection = null;

  // String sql = null;

  // PreparedStatement ps = connection.prepareStatement(sql);

  // byte [] buffer = new byte[fs.available()];

  // fs.read(buffer);

  A a = new B();

  try {

  a.method();

  } catch (FileNotFoundException e) {

  e.printStackTrace();

  }

  }

  }

  class A{

  void method () throws FileNotFoundException{

  }

  }

  class B extends A{

  // @Override

  // void method() throws IOException {

  // }

  }

  四:throw:

  人工手动抛出异常:

  1. 创建一个异常类对象

  2. 在方法内部使用 throw 关键字把该异常类对象抛出去!

  自定义的异常类:

  1. 通常继承自 RuntimeException(可以继承 Exception)

  2. 自定义的异常类就是用来被人工抛出的!

  import java.util.Scanner;

  public class TestThrow {

  public static void main(String[] args) {

  try {

  inputAge();

  } catch (Exception e) {

  System.out.println(e.getMessage());

  }

  System.out.println("end...");

  }

  /**

  * 输入年纪: 要求年纪必须在 15-30 之间, 超出 30 则年纪偏大

  */

  public static void inputAge(){

  Scanner sc = new Scanner(System.in);

  System.out.print("age=");

  int age = sc.nextInt();

  if(age > 30){

  // System.out.println("年纪偏大.");

  throw new AgeTooLargeException("年纪偏大.");

  }

  }

  public static void test(){

  //1. 创建一个异常类对象

  RuntimeException ex = new RuntimeException();

  //2. 把异常类对象抛出去

  throw ex;

  }

  }

  五、自定义异常举例:

  1、先定义一个异常类:

  public class EcDef extends RuntimeException{

  public EcDef() {

  // TODO Auto-generated constructor stub

  }

  public EcDef(String msg) {

  super(msg);

  }

  }

  2、再创建一个处理异常的类:

  public class EcmDef {

  public static void main(String[] args) {

  try {

  int i = Integer.parseInt(args[0]); // "a"

  int j = Integer.parseInt(args[1]);

  System.out.println(ecm(i, j));

  } catch (ArrayIndexOutOfBoundsException e) {

  System.out.println("输入的参数个数不足.");

  } catch (ArithmeticException e) {

  System.out.println("除数不能为 0");

  } catch (EcDef e) {

  System.out.println(e.getMessage());

  } catch (NumberFormatException e) {

  System.out.println("输入的参数不能转为整型.");

  }

  }

  public static int ecm(int i, int j){

  if(i < 0 || j < 0){

  throw new EcDef("不能处理负数. ");

  }

  int result = i / j;

  return result;

  }

  }