抛出异常

抛出异常有三种形式,一是throws,一个throw,还有一种系统自动抛异常。下面它们之间的异同:

1.throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)

throws 用于抛出方法层次的异常,并且直接由些方法调用异常处理类来处理该异常,所以它常用在方法的后面。

语法:[(修饰符)](返回值类型)(方法名)([参数列表])[throws(异常类)]{......}

public void function() throws Exception{......}

当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常,然后交给上层调用它的方法程序处理。

范例一:

public class TestDemo{
public static void function() throws NumberFormatException{
String s = '沐兮沐楚';
System.out.println(Double.parseDouble(s));
}
public static void main(String[] args) {
try{
function();
}catch(NumberFormatException e){
System.out.println('非数据类型不能转换');
e.printStackTrace();//打印出异常,并显示出更深的调用信息
}
}
}

执行结果:

非数据类型不能转换

java.lang.NumberFormatException: For input string: '沐兮沐楚'
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at TestDemo.function(TestDemo.java:4)
at TestDemo.main(TestDemo.java:8)

2.throw是语句抛出一个异常。

throw 用于方法块里面的代码,比throws的层次要低,比如try...catch ....语句块,表示它抛出异常,但它不会处理它,而是由方法块的throws Exception来调用异常处理类来处理。

语法:throw (异常对象);

throw e;

一般会用于程序出现某种逻辑时程序员主动抛出某种特定类型的异常。

范例二:

public class TestDemo{
public static void main(String[] args) {
String s = '沐兮沐楚';
if(s.equals('沐兮沐楚')){
throw new NumberFormatException();
}else{
System.out.println(s);
}
}
}

执行结果:(会抛出异常)

Exception in thread 'main' java.lang.NumberFormatException
at TestDemo.main(TestDemo.java:5)

3.系统自动抛出的异常

所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行。

当程序语句出现一些逻辑错误、主义错误或类型转换错误时,系统会自动抛出异常。

范例三:

public class TestDemo{
public static void main(String[] args) {
int a = 5;
int b = 0;
System.out.println(a/b);
}
}

执行结果:(系统会自动抛出ArithmeticException异常)

Exception in thread 'main' java.lang.ArithmeticException: / by zero
at TestDemo.main(TestDemo.java:5)

范例四:

public class TestDemo{
public static void main(String[] args) {
String s = '沐兮沐楚';
System.out.println(Double.parseDouble(s));
}
}

执行结果(系统会自动抛出NumberFormatException异常):

Exception in thread 'main' java.lang.NumberFormatException: For input string: '沐兮沐楚'
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at TestDemo.main(TestDemo.java:4)

throw与throws的区别

1、throws出现在方法函数头;而throw出现在函数体。

2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常对象。

3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。

好的编程习惯:

1.在写程序时,对可能会出现异常的部分通常要用try{...}catch{...}去捕捉它并对它进行处理;

2.用try{...}catch{...}捕捉了异常之后一定要对在catch{...}中对其进行处理,那怕是最简单的一句输出语句,或栈输入e.printStackTrace();

3.如果是捕捉IO输入输出流中的异常,一定要在try{...}catch{...}后加finally{...}把输入输出流关闭;

4.如果在函数体内用throw抛出了某种异常,最好要在函数名中加throws抛异常声明,然后交给调用它的上层函数进行处理。