写java时候,可能会经常遇到异常,如果对异常有个清晰的认识,异常并不可怕


---------------------------------------
java为我们提供了非常完美的异常处理机制
对于处理异常:
1.我们要减少try中的代码
2.保证资源都能关闭,学会使用finally
3.catch 尽量补获最具体的异常
在开发中
【我们要尽量做到,能避免的异常尽量避免,不能避免的异常要进行处理】


从根部说起异常分为两大类
Error
程序无法处理的异常,一般伴随这jvm虚拟机停止,或者断电之类
这种问题,是无法通过程序来解决的。
Exception
[这中异常是可控的,也分为两大类]
非运行异常:
名如其意,非运行就是在编译时候的异常,可以说是编译器给我们检查时候的异常
checkException异常。
----------------------------
这种异常,是哪些没有遵守java语言规则,容易看出和解决的
运行异常:
程序运行期间的异常 uncheckException

----------------------------
运行异常,具有不确定性,往往难以排查,包括处理逻辑问题。


Exception
A.IOException
1.EOFException 当流意外关闭
2.FileNotFoundException  当打开文件失败
3.MalformedURLException  URL不合法异常
4.UnknownHostException

B.RuntimeException
1.NullPointException     空指针异常
2.IllegalStateException 非法或不适当的时间调用方法
3.IllegalArgumentException  不合法参数异常
a.NumberFormatException
转换格式不匹配
4.ClassCastExcepion 类转换异常
5.ArithmeticException    算术异常
6.NoSuchElementException 枚举中没有找到抛出异常
a.InputMismatchException
获取的标记与期望类型的模式不匹配
7.IndexOutOfBoundsException 索引错误异常
a.ArrayIndexOutOfBoundsException ###数组越位
 

C.ClassNotFoundException     类加载异常

D.CloneNotSupportException   该类无法实现cloneable接口抛出

E.java中同样运行自定义异常
只要继承相对的异常类型就可以。
可以继承Exception和RuntimeException
如果一个问题你要throw 一个自定义的异常,就在方法外面
准备一个接受你抛出异常的父类,
然后在使用的时候用抛出的就可以打印出,你自定义的
异常信息。

/*
public void math(int b) throws Exception{
if(b==0){throw new myException("不能为0");}}
public static void main(String[] args){
Test t=new Test();
try {t.math(b);
} catch (Exception e) {
e.printStackTrace();
}
}
*/

try{
...
//可能出现异常的代码
}catch(Exception e){
...
//捕捉异常对异常进行处理的代码
}finally{
...
//不论是否有异常一定执行的代码
//当然如果执行到finally时候虚拟机停止了,就肯定不执行
}




try代码块可能带有返回关键字,这种情况是非常特殊的sun公司有定义
这段代码是这样执行,
1.首先运行return(把结果存入临时变量中)
2.然后执行finally
3.然后再次执行return

但是返回的是第一次执行return时候的临时变量


【就算catch中有return关键字,finally也会执行的】

------------------------------------------------------------------------------



异常和错误
1.异常是jvm告诉我们的错误,是让处理的
2.错误是,jvm出现了错误,系统级的错误jvm关闭,一般很难处理
内存溢出:(栈)没有内存了
内存泄露:(堆)对象没有释放,导致没有多余内存分配



------------------------------------------------------------------------------

异常链
当我们使用抛出了很多异常,要接受多有的异常就会涉及到异常链
一个异常抛出了,然后下一个异常接受这个异常然后再抛一个
e:为老的异常
new myException("新的异常",e)

/**
 * 异常链
 */
class myException extends Exception {


private static final long serialVersionUID = 1L;


myException() {


}


myException(String message,Exception e) {
super(message,e);
}


}
public class Test {
    public void f() throws myException{
         try {
            FileReader reader = new FileReader("G:\\myfile\\struts.txt");  
             Scanner in = new Scanner(reader);  
             System.out.println(in.next());
        } catch (FileNotFoundException e) {
            //e 保存异常信息
            throw new myException("文件没有找到--01",e);
        }  
    }
    
    public void g() throws myException{
        try {
            f();
        } catch (myException e) {
            //e 保存异常信息
            throw new myException("文件没有找到--02",e);
        }
    }
    
    public static void main(String[] args) {
        Test t = new Test();
        try {
            t.g();
        } catch (myException e) {
        e.printStackTrace();
        }
    }
}


---------------------------------------
参考资料
http://cmsblogs.com/?p=84
http://blog.csdn.net/zhangerqing/article/details/8248186




















  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个Java自定义异常类的例子: ```java public class NegativeNumberException extends Exception { public NegativeNumberException(String message) { super(message); } } ``` 这个例子中,我们自定义了一个NegativeNumberException类,它继承自Exception类。我们在类中定义了一个构造函数,它接受一个字符串参数,用于传递异常信息。 现在我们来看一个使用这个自定义异常类的例子: ```java public class Calculator { public static int divide(int dividend, int divisor) throws NegativeNumberException { if (divisor == 0) { throw new ArithmeticException("Cannot divide by zero"); } if (dividend < 0 || divisor < 0) { throw new NegativeNumberException("Both dividend and divisor must be positive"); } return dividend / divisor; } } ``` 在这个例子中,我们定义了一个名为Calculator的类,它有一个名为divide的静态方法。这个方法接受两个整数作为参数,并返回它们的商。如果除数为零,我们将抛出一个新的ArithmeticException异常。如果被除数或除数是负数,我们将抛出一个新的NegativeNumberException异常。 现在我们来测试一下这个方法: ```java public class Main { public static void main(String[] args) { try { int result = Calculator.divide(10, -2); System.out.println(result); } catch (NegativeNumberException e) { System.out.println(e.getMessage()); } catch (ArithmeticException e) { System.out.println(e.getMessage()); } } } ``` 在这个例子中,我们尝试调用Calculator类的divide方法,并传递10和-2作为参数。这将导致我们抛出一个NegativeNumberException异常,因为我们的自定义异常类要求被除数和除数都必须是正数。我们在try-catch块中捕获这个异常,并输出它的错误信息。 输出结果应该是: ``` Both dividend and divisor must be positive ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值