java异常
1.异常概述
在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是否始终保持通畅等等。
什么是异常?
程序执行发生的不正常情况,异常可以处理,可通过编程防止异常发生
Java程序在执行过程中所发生的异常事件可分为两类:
Error: Java虚拟机无法解决的严重问题。如:JVM系统内部错误、资源耗尽等严重情况。比如**:StackOverflowError和OOM**。一般不编写针对性的代码进行处理。
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:
√空指针访问√试图读取不存在的文件
√网络连接中断
√数组角标越界
- 未检查异常(运行时异常);执行后才能发现
- 已检查异常,编译时发现
2.try-catch-finally
一般使用try-catch-finally处理编译时异常。不针对运行时异常。
try{
//可能出现异常的代码
}catch(异常类型1变量名1){
//处理异常的方式1
}catch(异常类型2变量名2){
//处理异常的方式2
}catch(异常类型3变量名3){
//处理异常的方式3
finally{
//一定会执行的代码
}
public class Calc {
public static void main(String[] args) {
Scanner sc = new Scanner (System.in);
System.out.println("输入第一个数字");
int num1=sc.nextInt();
System.out.println("输入第二个数字");
int num2=sc.nextInt();
/*float result = num1/num2;
System.out.println(result);*/
float result = 0F;
try{
result = num1/num2;//抛出异常
}catch(Exception e) {//捕获异常
System.out.println("除数不能为0");
//打印出错情况,在开发调试时,帮助程序员排错。
//在生产环境时去掉
e.printStackTrace();
}
System.out.println(result);
//finally中声明的是一定会执行的代码,即使catch又出现了,try中有return语句,catch中有return语句等情况。
finally{
System.out.println("异常");
}
}
}
像数据库连接、输入输出流、网络编程Socket等资源,JVM是不能自动回收的,我们需要自己手动的进行资源的释放,此时的资源释放,就需要声明在finally中。
try-catch结构可以嵌套。
3.throws+ 异常类型
“throws + 异常类型” 写在方法的声明处;指明此方法执行时,可能会抛出的异常类型。一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不再执行!
体会:
try-catch-finally: 真正的将异常给处理掉了。
throws的方式只是将异常抛给了方法的调用者。并没有真正将异常处理掉。
4.throw
class student{
private int id;
public void regist(int id){
if(id >0)i
this.id = id;
}else{
//System.out.println("您输入的数据非法!");//手动抛出异常对象
throw new RuntimeException( "您输入的数据非法!");
}
}
}
5.自定义异常类
继承于现有的异常结构:RuntimeException、Exception
提供全局常量:serialVersionUID.
提供重载的构造器。
public class MyException extends RuntimeException{
static final long serialVersionuID = -7034897193246939L;
public MyException(){
}
public MyException( String msg){
super (msg);
}
}
练习
编写应用程序EcmDef.java,接收命令行的两个参数,要求不能输入负数,计算两数相除。
对数据类型不一致(NumberFormatException)、缺少命令行参数(ArraylndexOutOfBoundsException、
除O(ArithmeticException)及输入负数(EcDef自定义的异常)进行异常处理。
public class EcDef extends Exception{
static final long seriaLVersionUID = -3566131564313L;
public EcDef(){ }
public EcDef(String msg){
super(msg);
}
}
public class EcmDef {
public static void main(String[] args) {
try {
int i = Integer.parseInt(args[0]);
int j = Integer.parseInt(args[1]);
int result = ecm(i,j);
System.out.println(result);
}catch (NumberFormatException e){
System.out.println("数据类型不一致");
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("缺少命令行参数");
}catch (ArithmeticException e){
System.out.println("除0");
}catch (EcDef e){
System.out.println(e.getMessage());
}
}
public static int ecm(int i, int j) throws EcDef{
if(i<0||j<0){
throw new EcDef("分子或分母为负数");
}
return i/j;
}
}
public static int ecm(int i, int j) throws EcDef{
if(i<0||j<0){
throw new EcDef("分子或分母为负数");
}
return i/j;
}
}