1. Java中exception异常
class="java" name="code">
Java中的异常分为两大类:
1) Checkedexception(非RuntimeException)
2) Uncheckedexception(RuntimeException)
Java中所有的异常类都会直接或间接地继承Exception父类。
public class ExceptionTest {
public static void main(String[] args) {
int c = 0;
try {
int a = 3;
int b = 0;
c = a / b;
System.out.println("hello world");
}
catch (ArithmeticException e) {
e.printStackTrace();
}
finally{
System.out.println("welcome");
}
System.out.println(c);
}
}
运行结果:
java.lang.ArithmeticException: / by zero
at test10.ExceptionTest.main(ExceptionTest.java:9)
welcome
0
可以自己抛出异常throw new Exception()
public class Exception2 {
public void method() throws Exception{
System.out.println("hello world");
throw new Exception();
}
public static void main(String[] args) {
Exception2 test = new Exception2();
try {
test.method();
}
catch (Exception e) {
e.printStackTrace();
}
finally{
System.out.println("in the end");
}
}
}
运行结果:
hello world
java.lang.Exception
at test10.Exception2.method(Exception2.java:6)
at test10.Exception2.main(Exception2.java:11)
in the end
对于非运行时异常(checkedexception),必须要对其进行处理,处理方式有两种:第一种是使用try..catch…finally进行捕获;第二种是在调用该会产生异常的方法所在的方法声明throwsException。
对于运行时异常(runtime exception),我们可以不对其进行处理,也可以对其进行处理。推荐不对其进行处理。
public class Exception3 {
public static void main(String[] args) {
String str = null;
System.out.println(str.length());
}
}
运行结果:
Exception in thread "main" java.lang.NullPointerException
at test10.Exception3.main(Exception3.java:6)
2. 自定义exception异常
public class MyException extends Exception{
public MyException() {
super();
}
public MyException(String message){
super(message);
}
}
public class ExceptionTest4 {
public void method(String str) throws Exception{
if (null == str) {
throw new MyException("传入的字符串参数不能为null");
}
else if ("hello".equals(str)) {
throw new MyException2("传入的字符串不能为hello");
}
else {
System.out.println(str);
}
}
public static void main(String[] args){
try {
ExceptionTest4 test = new ExceptionTest4();
test.method("hello");
}
catch(MyException e){
System.out.println("进入到MyException catch块");
e.printStackTrace();
}
catch(MyException2 e){
System.out.println("进入到MyException2 catch块");
e.printStackTrace();
}
catch(Exception e){
System.out.println("进入到Exception catch块");
e.printStackTrace();
}
finally{
System.out.println("异常处理完毕");
}
System.out.println("程序执行完毕");
}
}
运行结果:
进入到MyException2 catch块
test11.MyException2: 传入的字符串不能为hello
at test11.ExceptionTest4.method(ExceptionTest4.java:9)
at test11.ExceptionTest4.main(ExceptionTest4.java:19)
异常处理完毕
程序执行完毕
"hello".equals(str)如果str为null,判断结果返回false;
Str.equals(“hello”)如果str为null,会抛出空指针异常;
exception异常处理可以有多个catch块,但是运行时只能进入一个catch块。
我们可以使用多个catch块来捕获异常,这时需要将父类型的catch块放到子类型的catch块之后,这样才能保证后续的catch可能被执行,否则子类型的catch将永远无法到达,Java编译器会报编译错误;如果多个catch块的异常类型是独立的(MyException,MyException2),那么谁前谁后都是可以的。
如果try块中存在return语句,那么首先也需要将finally块中的代码执行完毕,然后方法再返回。
public class MyException2 extends Exception{
public MyException2(){
super();
}
public MyException2(String message){
super(message);
}
}
public class ExceptionTest5 {
public void method(){
try {
System.out.println("进入到try块");
// 表示退出不执行后面代码
System.exit(0);
}
catch (Exception e) {
System.out.println("异常发生了");
}
finally{
System.out.println("进入到finally块");
}
System.out.println("异常处理后续的代码");
}
public static void main(String[] args) {
ExceptionTest5 test = new ExceptionTest5();
test.method();
}
}
运行结果:
进入到try块