Java:简述throw-throws异常抛出
Java中的异常(Exception),史上最全的教程来啦~
关于异常中的finally的使用
finally的作用
关于fianlly两个例子
finally没有return 语句
public class Exception01 {
public static void main(String[] args) {
System.out.println(getNum());
}
public static int getNum() {
//当finally 中没有return语句时
int i=100;
try{
System.out.println("try block");
i=1/0;
return i;
}catch (Exception e){
System.out.println("catch block");
e.printStackTrace();
i=i+5;
return i;//最终返回的值还是 105 即 finally 对i的修改没有影响 i变量
//理解是 在return执行时 先将此时的i入栈 然后利用一个局部变量j保存i值,在使j进入finally语句块中
}finally {
System.out.println("finally block");
i=600;
}
}
返回值:
try block
catch block
finally block
105
java.lang.ArithmeticException: / by zero
at Exception01.getNum(Exception01.java:44)
at Exception01.main(Exception01.java:3)
为什么是105呢 ? 为什么不是600呢?
常理来说 return 语句执行 程序结束
而finally语句在结束前执行
这里我的理解是 sum为了为序
在return 返回一个值 i 的时候 会先将其入栈,然后用一个局部变量 j 赋予 i 的值,再进入finally部分
**finally语句带有return **
public class Exception01 {
public static void main(String[] args) {
System.out.println(getNum());
}
public static int getNum() {
//当finally 中有return语句的时候,先在try或者catch语句中中的return值 压入栈 ,并用中间节点保存该值 进入finally,单finally中也有return 语句
//所以此时return语句的返回值也入栈 即程序结束后 return的最终返回值 按照栈的原则 返回是finally的返回值
int i=100;
try {
System.out.println("try block");
int a = 1 / 0;
return i++;
} catch (Exception e) {
System.out.println("catch block"+"且在block中的return 会自加1000");
return i=i+1000;
} finally {
System.out.println("finally block");
i=66;
System.out.println("进入finally后的i值修改为 "+i+"且在finally中的return 会自加123");
return i+123;
}
}
}
结果
try block
catch block且在block中的return 会自加1000
finally block
进入finally后的i值修改为 66且在finally中的return 会自加123
189
这里返回值为什么是189,而不是1100呢?
原因就在于 在try或catch语句的return 中确实压入栈且保存了 i 的值赋予 j 进入finally中 代表 i 值,但是由于finally中有return 语句,它的返回值也会进入同一个栈,而按照栈的先进后出原则 我们弹出栈顶元素 这样一来就是finally的return 值了
当然以上原则目前来看用来帮助理解的,也不知具体咋样,要等后面在验证!
那如何不执行finally呢
其实,在下述4种特殊情况时,finally块都不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU。
import java.util.Scanner;
public class Userdengji {
public static void main(String[] args) {
UserService user=new UserService();
System.out.println("请输入用户名和密码:");
Scanner scanner=new Scanner(System.in);
String name=scanner.nextLine();
String password=scanner.nextLine();
try {
user.register(name,password);
} catch (Usernameexception usernameexception) {
usernameexception.printStackTrace();
}
}
}
class UserService {
public UserService() {
}
//String name,password;
public void register (String username, String userpassword) throws Usernameexception{
if(username.length()>14){
//异常
System.out.println(username.length());
throw new Usernameexception("用户名个数超过14");
}
if(username.length()<6){
//异常
System.out.println(username.length());
throw new Usernameexception("用户名低于6");
}
}
}
class Usernameexception extends Exception{
public Usernameexception() {
super();
}
public Usernameexception(String message) {
super(message);
}
}