java异常处理

异常处理

异常处理是在程序运行时如果产生异常的一种处理。

java中的异常产生主要有三种情况:

1.java虚拟机产生的异常
2.编写的程序代码中的错误所产生的异常。
3.通过throw语句手动生成的异常

java public class throwTest { public static void main(String [] args){ System.out.println("请输入你的选择 1-3之间的整数"); Scanner input=new Scanner(System.in); int num=input.nextInt(); switch (num){ case 1: System.out.println("one"); break; case 2: System.out.println("Two"); break; case 3: System.out.println("Three"); break; default: System.out.println("重新输入吧"); break; } } } //如果用户输入的不是1-3之间的整数则会报错

异常类型

java里给我们提供了异常类(Throwable),所有的异常类型都是Throwable的子类,Throwable下又有两个子类,Error(错误)和Exception(异常)。Exception又分为运行时异常()和非运行时异常。

 Exception类用于用户程序可能出现的异常情况,它也是用来创建自定义异常类型的类。

 Error定于了在环境下不希望被程序捕获的异常,一般指的是jvmvu错误。


  常见的运行时异常

  ArithmeticException  算术错误异常,如以零做除数。
  ArrayIndexOutOfBoundException 数组索引越界
  ArrayStoreException  向类型不兼容的数组元素赋值
  ClassCastException 使用非法实参调用方法。
  IIIegalStateException 环境或程序处于不正确的状态
  IIIegalThreadStateException 被请求的操作与当前线程状态不兼容
  IndexOutOfBoundsException 某种类型的索引越界
  NullPointerException 尝试访问null对象成员,空指针异常
  NegativeArraySizeException 再负数范围内创建的数组
  NumberFormatException 数字转化格式异常,比如字符串到floatr型数字的转换无效
  TypeNotPresentException 类型未找到

  常见的非运行时异常

  ClassNotFoundException 没有找到类
  IIIegalAccessException 访问类被拒绝
  InstantiationException 试图创建抽象类或接口的对象
  InterruptedException 线程被另一个线程中断
  NoSuchFieldException 请求的域不存在
  NoSuchMethodException 请求的方法不存在
  ReflectiveOperationException 与反射有关的超类

异常处理机制

异常的产生是不可避免的,那么为了保证程序的运行,需要对发生的异常进行相应的处理。java的异常处理通过五个关键字 try catch(捕获并处理异常) finally (任何情况下都必须执行的代码) throw 抛出异常 throws声明可能会出现的异常。

java try{ //可能发生异常的语句 }catch (){ //错误处理 throw();//抛出异常 }finally{ //无论什么情况都必须执行的代码 } ```java //try catch使用 import java.util.Scanner;

public class throwTest { public static void main(String [] args){ System.out.println("你的信息"); Scanner input=new Scanner(System.in); String name = null; int age = 0; String sex = null; try{ System.out.println("请输入姓名"); name=input.next(); System.out.println("请输入年龄"); age=input.nextInt(); System.out.println("请输入性别"); sex=input.next(); }catch (Exception e) { e.printStackTrace(); System.out.println("输入有错误"); }finally { System.out.println("姓名"+name); System.out.println("年龄"+age); System.out.println("性别"+sex); }

} }

```

多个catch

如果try中有多个语句可能会发生异常,那么就需要有多个catch但是当一个catch执行后,其他的catch就不在执行。而且当多个异常之间存在父子关系时,捕获异常一般先捕获子类,再捕获父类所以子类异常必须在父类异常前面,否则子类捕获不到。

```java //计算平均成绩的多个catch import java.util.InputMismatchException; import java.util.Scanner;

public class throwTest { public static void main(String [] args){ Scanner input=new Scanner(System.in); try{ System.out.println("请输入班级总人数"); int count=input.nextInt(); System.out.println("请输入总成绩"); int score=input.nextInt(); int avg=score/count; System.out.println("本次的平均分为"+avg); }catch(InputMismatchException e1){ System.out.println("输入数值错误"+e1.getMessage()); }catch(ArithmeticException e2){ System.out.println("总人数不能为0"+e2.getMessage()); }catch (Exception e3){ e3.printStackTrace(); System.out.println("发生错误"+e3.getMessage()); }

} }

``` ## try catch finally 在实际开始中try catch可能不被完全执行,然而有些处理代码则必须要被执行官,所以就用到了finally(比如,在try里连接了数据库或者网络,出现异常这些连接没有被关闭,必须通过finally执行处理关闭的代码)

```java //finally 实战 import java.util.InputMismatchException; import java.util.Scanner;

public class throwTest { public static void main(String [] args){ Scanner input=new Scanner(System.in); System.out.println("windows 系统已经启动"); String [] params={"微信","QQ","chrome"}; try{ for (int i=0;i

} } ```

通常情况下,不在finally代码块中使用return 或者throw等导致方法终止的语句。如果是在try和catch里写return,finally的代码总会被执行,而且finally代码块在return语句执行之后return返回之前执行。如果try和catch的return是一个变量时,后面finally语句中即使有对返回的变量进行赋值的操作时,也不会影响返回的值。 ## 自动资源管理 当我们在try或者catch打开本地资源时,在finally里需要手动的关闭,这很麻烦,所以java提供给了自动资源管理。 ```java import java.io.*; import java.util.InputMismatchException; import java.util.Scanner;

public class throwTest { public static void main(String [] args) throws IOException { //且方法要添加异常 // 资源用final修饰 final BufferedReader br = new BufferedReader(new FileReader("Demo.java"));

final PrintStream ps = new PrintStream(new FileOutputStream("a. txt"));
// 只要将两个资源放在try后的圆括号内即可
try (br; ps) {
    // 使用两个资源
    System.out.println(br.readLine());
    ps.println("哈哈");
}

} } ```

抛出异常和声明异常

java里提供了抛出异常的关键字throw 声明异常的关键字throws

### 声明异常(throws) 当一个方法产生它不处理的异常时,那么就需要在该方法的头部声明这个异常,便于将异常传递到方法的外部进行处理。 java public static void main(String [] args) throws IOException {} //就是在方法的()后 {}前使用是throws关键字声明异常,如果有多个异常用,间隔开 使用throws抛出异常的解决是,当前的方法无法处理这个异常,由上一级调用者处理,如果到main方法还是无法处理则丢给jvm,jvm处理异常的方法是,打印异常的栈信息,并中断程序。 ```java import java.io.*; import java.util.InputMismatchException; import java.util.Scanner;

public class throwTest { public static void main(String [] args) { throwTest test=new throwTest(); try{ //调用方法 test.readFile(); }catch (IOException e){ System.out.println(e); e.printStackTrace(); } } public void readFile() throws IOException { //声明异常,发生异常丢给调用者处理 FileInputStream files=new FileInputStream("a.txt"); int f; while((f=files.read())!=1){ System.out.println((char)f); f=files.read(); } files.close(); } }

```

使用throws 声明异常时要注意一个规则,就是在继承时,如果子类,继承了父类,并且重写了父类带有声明异常的方法时,子类重写的声明异常的方法,声明的异常类,必须是,父类声明异常方法的异常类的子类或者相同,不能超出范围。

## throw 抛出异常 throw用来直接抛出一个异常 throw抛出异常之后的代码不会再继续执行,throw抛出异常之后会转向调用者去寻找对应的catch,如果没有则继续向上寻找 ```java import java.io.*; import java.util.InputMismatchException; import java.util.Scanner;

public class throwTest { public static void main(String [] args) { throwTest test=new throwTest(); Scanner input=new Scanner(System.in); System.out.println("请输入用户名"); String username=input.next(); boolean state; try{ state=test.userName(username); if(state){ System.out.println("注册成功"); } }catch(IllegalArgumentException e){ System.out.println(e); } } public boolean userName(String userNames) { boolean state=false; if(userNames.length() >=8 ){ for (int i=0;i

```

多异常捕获

如果我们有多个异常类型,但是处理结果是一样的我们可以这样写 ```java try{

}catch(异常类型1 | 异常类型2){ //采用同一个处理结果 } ```

自定义异常

我们可以自己定义一个异常类,这个异常类需要继承Exception类。自定义异常类通常包含两个构造方法,一个无参的构造方法,一个有参的构造方法,用于将异常信息传递给父类 ```java import java.io.*; import java.util.InputMismatchException; import java.util.Scanner;

public class throwTest { public static void main(String[] args) { throwTest test = new throwTest(); Scanner input = new Scanner(System.in); System.out.println("输入你的年龄"); int age; try{ age=input.nextInt(); if(age <0){ throw new AgeIf("输入的年龄不能为负数"); }else if(age>100){ throw new AgeIf("输入的年龄不能大于100"); }else{ System.out.println("输入成功"); } }catch(InputMismatchException e1){ System.out.println("必须输入数字"); }catch (AgeIf e){ System.out.println(e.getMessage()); } } } class AgeIf extends Exception { public AgeIf(){

}
public AgeIf(String errorInfo){
    super(errorInfo);
}

} ```

异常处理规则

1. 不要过度使用异常
 2. 不要使用异常处理代替流程控制语句
 3. 不要使用庞大的try代码块。
 4. 不要忽略捕获到的异常
 5. 对异常进行合适的修复,或者绕过异常,或者提醒用户
 6. 在合适的层级去处理异常,如果当前层无法处理就丢给上层调用者。
 7. 不要所有的异常都采用相同的处理方式
 8. 不要捕获Throwable异常类,他是所有异常类的父类,如果使用它将会捕获到所有的异常

异常跟踪栈

异常对象的printStackTrace方法,用于输出打印异常的跟踪栈信息,可以根据异常跟踪栈找到触发异常的源头。

## 记录日志 java.util.logging 类用于记录程序的运行轨迹

logging把日志分为七个等级对应七个调用方法

severe 严重
 warning 警告
 info 信息
 config 配置
 fine 良好
 finer 较好
 finest 最好

比info等级低的将不会显示在日志文件中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值