Java基础-异常
Posted sunnivazhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础-异常相关的知识,希望对你有一定的参考价值。
异常都是继承自Throwable类。
非检查异常unchecked exception:runtimeexception和error。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。
检查异常checked exception:其他异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。如SQLException , IOException,ClassNotFoundException 等。
处理方法:方法用throws抛出异常
注意事项:
当子类重写父类的带有 throws声明的函数时,其throws声明的异常必须在父类异常的可控范围内——用于处理父类的throws方法的异常处理器,必须也适用于子类的这个带throws方法 。这是为了支持多态。
例如,父类方法throws 的是2个异常,子类就不能throws 3个及以上的异常。父类throws IOException,子类就必须throws IOException或者IOException的子类。
在 try块中即便有return,break,continue等改变执行流的语句,finally也会执行。
finally中的return 会覆盖 try 或者catch中的返回值。
public
static
void
main(String[] args)
{
int
result;
result = foo();
System.out.println(result);
/////////2
result = bar();
System.out.println(result);
/////////2
}
public
static
int
foo()
{
try{
int
a =
5
/
0
;
}
catch
(Exception e){
return
1
;
}
finally
{
return
2
;
}
}
public
static
int
bar()
{
try
{
return
1
;
}
finally
{
return
2
;
}
}
public
static
void
main(String[] args)
{
int
result;
try
{
result = foo();
System.out.println(result);
//输出100
}
catch
(Exception e){
System.out.println(e.getMessage());
//没有捕获到异常
}
try
{
result = bar();
System.out.println(result);
//输出100
}
catch
(Exception e){
System.out.println(e.getMessage());
//没有捕获到异常
}
}
public
static
int
foo()
throws
Exception
{
try
{
int
a =
5
/
0
;
return
1
;
}
catch
(ArithmeticException amExp) {
throw
new
Exception(
"我将被忽略,因为下面的finally中使用了return"
);
}
finally
{
return
100
;
}
}
public
static
int
bar()
throws
Exception
{
try
{
int
a =
5
/
0
;
return
1
;
}
finally
{
return
100
;
}
}
public
static
void
main(String[] args)
{ int
result;
try
{
result = foo();
}
catch
(Exception e){
System.out.println(e.getMessage());
//输出:我是finaly中的Exception
}
try
{
result = bar();
}
catch
(Exception e){
System.out.println(e.getMessage());
//输出:我是finaly中的Exception
}
}
public
static
int
foo()
throws
Exception
{
try
{
int
a =
5
/
0
;
return
1
;
}
catch
(ArithmeticException amExp) {
throw
new
Exception(
"我将被忽略,因为下面的finally中抛出了新的异常"
);
}
finally
{
throw
new
Exception(
"我是finaly中的Exception"
);
}
}
public
static
int
bar()
throws
Exception
{
try
{
int
a =
5
/
0
;
return
1
;
}
finally
{
throw
new
Exception(
"我是finaly中的Exception"
);
}
}
以上是关于Java基础-异常的主要内容,如果未能解决你的问题,请参考以下文章