大家好,又见面了,我是全栈君。
异常处理,
异常的产生
运行时异常:程序运行中产生的异常;RuntimeException类。
编译时异常:程序在编译时产生的异常;除了RuntimeException类 其他都是编译时产生的异常。
处理异常两种方式
抛出异常:把异常抛给调用者区解决 throws 抛出异常
捕获异常:编程者自己处理try….catch…finally…
创建异常,
1.自己创建sun公司的异常类对象
public class ClassException {
public static void main(String[] args) {
try {//如果出现异常 用来捕获异常
checkScore(110);
} catch (Exception e) {
e.printStackTrace();//输出 异常类型,异常原因,异常位置。 内部具有多线程
}
}
private static void checkScore(int i) throws RuntimeException {
if (i<0||i>100) {
throw new RuntimeException("不符合要求");//创建运行时异常对象
}
System.out.println("符合要求");
}
}
输出结果 :
java.lang.RuntimeException: 不符合要求
at day08.ClassException.checkScore(ClassException.java:28)
at day08.ClassException.main(ClassException.java:21)
2.自定异常类继承sun公司的异常类(异常名字可以自定义)
定义一个自定义类 (MyException)
public class NotToPrintException extends Exception{//继承Exception类 调用父类构造输出异常信息
public NotToPrintException() {
super();
}
public NotToPrintException(String message) {
super(message);
}
}
public class ClassException {
public static void main(String[] args) {
try {
checkScore(110);
} catch (Exception e) {
e.printStackTrace();//输出异常类型,异常原因,异常位置 内部具有多线程
} }
//使用自定义异常类来抛出异常
private static void checkScore(int i) throws NotToPrintException {//使用自定义类捕获异常
if (i<0||i>100) {
throw new NotToPrintException("不符合要求");//抛出NotToPrintException对象
}
System.out.println("符合要求");
}
}
day08.NotToPrintException: 不符合要求 at day08.ClassException.checkScore(ClassException.java:29) at day08.ClassException.main(ClassException.java:21)
finally,
作用: 做为程序的善后的工作
执行顺序:try和catch之后
public class FinallyTest {
public static void main(String[] args) {
FileWriter fw=null;
try {
fw=new FileWriter("a.txt");
fw.write("hello");
fw.write("world");
System.out.println(10/0);//报异常 但是fw还没有关闭 数据没有写进去
fw.write("java");
} catch (IOException e) {
e.printStackTrace();
} catch (ArithmeticException e) {
e.printStackTrace();
}finally{
try {
if (fw!=null) {
fw.close();//如果中途出现错误 但为了让数据已经写的数据存在文本中 则在finally中进行关闭流操作。
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
a.txt文件中内容
helloworld
特殊案例:catch中存在return 和System.exit(0);
public class FinallyTest {
public static void main(String[] args) {
System.out.println(method1());
}
private static int method1(){
int a=10;
try{
System.out.println(10/0);
a=20;
}catch(Exception e){
a=30;
return a;//在执行finally之前会 return a时 这时a已经被赋值为30 再执行finally中a=40不会影响return a中的a值
}finally{
a=40;
}
return a;
}
}
输出结果:
30
/*
* return a在程序执行到这一步的时候,这里不是return a而是return 30;这个返回路径就形成了。
* 但是呢,它发现后面还有finally,所以继续执行finally的内容,a=40
* 再次回到以前的返回路径,继续走return 30;
*/
public class FinallyTest {
public static void main(String[] args) {
System.out.println(method1());
}
private static int method1(){
int a=10;
try{
System.out.println(10/0);
a=20;
}catch(Exception e){
a=30;
System.out.println(a);
System.exit(0);//程序退出 不会执行finally
}finally{
System.out.println(1);
a=40;
}
return a;
}
throws和throw的区别
throws:
位置:方法声明上
作用:抛出异常 (处理异常的一种方式)
throw:
位置:方法中
作用:创建一个异常对象 (制造异常)
public class ClassException {
public static void main(String[] args) {
try {
checkScore(110);
} catch (Exception e) {
e.printStackTrace();
}
checkScore(10);
}
private static void checkScore(int i) throws RuntimeException {//抛出异常 抛给调用者进行处理
if (i<0||i>100) {
throw new RuntimeException("不符合要求");//制造异常
}
System.out.println("符合要求");
}
}
转载于:https://www.cnblogs.com/fjkgrbk/p/Try_Catch_Finally.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108199.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...