上这个课的时候我脑子很乱,我不理解try catch语句是要写哪里,还有throw throws的用法
throw要放在哪里,反正就是很多东西没有理解到位。
现在我们来从头到尾来梳理一遍
首先我们看一下下面这个代码
- import java.util.*;
- public class testdemo {
- public static void main(String argu[]){
- Scanner scanner=new Scanner(System.in);
-
- int a=10;
- int b=0;
- int result=0;
- result = a / b;
- System.out.println("result="+result);
-
- }
- }
我执行这段代码 会发现出错
因为0不能做除数,报错如下,我们发现最后一句System.out.println("result")那句是输出不出来的
说明在result=a/b那一句直接发生断层了,后面直接不执行了。因为发生了异常。
我们一般用系统已经给出来的异常类Exception,但是这个Exception应该放在哪里呢?
首先我们的Exception是不用自己写的,如果发生了错误,我们会直接产生Exception,那这个Exception要怎么用呢?怎么调用呢,他会产生在哪里呢?
我们来举一个简单的例子。
但首先我们要知道try catch 还有final语句
- import java.util.*;
- public class testdemo {
- public static void main(String argu[]){
- Scanner scanner=new Scanner(System.in);
-
- int a=10;
- int b=0;
- int result=0;
- try {
- System.out.println("这句话是try内部的代码1,位于出错代码前面");
- result = a / b;
- System.out.println("这句话是try内部的代码2,位于出错代码后面");
- }
- catch (Exception shit) {
- System.out.println("进入catch内的代码,可以调用Exception a了");
- System.out.println("开始调用a的成员方法");
- System.out.println(shit.getMessage());
- System.out.println(shit.toString());
- }
- finally {
- System.out.println("这是finally方法部分,无论发生什么都会执行这个部分");
- }
-
-
- }
- }
-
这个是执行结果,你可以复制我的代码 自己去编程软件里面看一看,是不是一样的结果。
我们参照这样的输出结果,然后自己和我的代码一行一行的去对照,这个过程你一定要做。
不要让我给你解释 因为你记不住。
有同学看到这段代码就有点懵逼了,有点看不懂,我来给你解释一下。
- package homwork4;
- import java.util.*;
- public class testdemo {
- public static void main(String argu[]){
- Scanner scanner=new Scanner(System.in);
-
- int a=10;
- int b=0;
- int result=0;
- try {
-
- result = a / b;/*注意看这个地方,这个地方会发生错误
- 系统会自动生成一个Exception类的变量,但是你不知道,因为他是隐藏起来的
- 你要写一个变量去接受它。这就是我们下一行代码catch哪个代码做的事情*/
-
- }
- catch (Exception shit) /*
- 你可以随便给这个Exception起名字,你可以像我一样叫他shit,
- 你也可以叫他boy,girl,反正变量名是什么都可以
- 但记得下面调用的时候,也要记得一起改名字*/
- {
-
- System.out.println(shit.getMessage());//有同学不理解,比如我,这个getMessage是哪里来的?这个系统Exception类自动带的方法,就像Random,Scanner,一样都是自带的。
- System.out.println(shit.toString());//toString也是Exception类自带的成员方法
- }
- finally {
- System.out.println("这是finally方法部分,无论发生什么都会执行这个部分");
- }
-
-
- }
- }
-
注意注意!!try catch finally这些语句都要写要执行的主函数里面,就是String Argu[]里面,不要把它揉到其他类里面。
- package homwork4;//这个看不明白先不管 学了包再来看
- class MyException extends Exception{
- String message;//用来记录自己想要返回的信息
- public MyException(int age)//
- {
- System.out.println("myexception的构造函数用来给成员变量message赋值");
- message="message为记录age的值"+age;
- }
- public String toString(){
- return message;
- }
- }
- public class People {
- private int age=1;
- public int getAge(){
- System.out.println("这是自己写的getAge函数,功能是返回age的数值");
- return age;
- }
- public void setAge (int a)throws MyException//throws后面是你这个方法可能用到的自定义异常类 throws和throw相互呼应缺一不可
- {
- System.out.println("这是自己写的setAge函数,功能是改变age的数值");
- if(a<=0||a>=100){
- System.out.println("这是setage内部,同时当你看见现在这段文字的时候,说明已经超出范围了,我们要手动暂停程序,然后代替系统执行生成EXception类的行为");
- throw new MyException(age);//你写throw的时候函数setAge后面必须要写throws
- }
- else{
- this.age=a;
- }
- }
- }
上面是People类和MyExtension的定义
下面是String主函数的执行代码
- package homwork4;
- import java.util.*;
- public class testdemo {
- public static void main(String argu[]){
-
- int result=0;
- People Patrick=new People();
- People Edison=new People();
- try
- {
- Patrick.setAge(180);
- }
- catch (MyException shit) //此时的shit在People里面已经被有参构造好了
- {
- System.out.println(shit.toString());
- }
- System.out.println("-----------------------------------");
-
- try
- {
- Edison.setAge(87);
- }
- catch(MyException damn){
- System.out.println(damn.toString());//如果成功这一行就不会执行
- }
-
- System.out.println("-----------------------------------");
-
- }
- }
-
-
同学们自己参照一下 一行行的对比。
大部分的注释我都写在代码里面的注意看看。
还听不懂就看这个视频Java 异常类基础知识_哔哩哔哩_bilibili