首页 > 编程语言 >java异常

java异常

时间:2024-07-31 20:27:30浏览次数:13  
标签:java String println Test main 异常 public

异常

1、对异常的理解

Throwable

Error类:程序运行过程中,非常严重的错误,我们是处理不了的  

 1.如while(true)死循环 会报堆溢出

2.栈内存溢出

比如说:

public class Test {
    public static void main(String[] args) {
        test();
    }
    public static void test (){
        test();
    }
}
就会报异常
    at com.d729.Test.test(Test.java:8)
    at com.d729.Test.test(Test.java:8)

这种错误一旦发生,我们阻止不了,只能修改代码

Exception类:一些简单的异常,通常我们处理的就是这种异常

语法错误不能称为编译器异常

1、编译期异常:

写代码时报错/红色,此时声称不了class文件,是不能运行的

public class Test {
    public static void main(String[] args) {
        String strData = "2024-07-31";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date data = simpleDateFormat.parse(strData);
    }
}

会出错,目的是起警示作用

Error:(10, 43) java: 未报告的异常错误java.text.ParseException; 必须对其进行捕获或声明以便抛出

解决方法1是将异常上抛,告诉计算机已经检查过了,没有问题,若代码有问题还是会报错.

public class Test {
    public static void main(String[] args) throws ParseException {
        String strData = "2024-07-31";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date data = simpleDateFormat.parse(strData);
        System.out.println(data);

    }

}

解决方法2是捕获异常  try--catch

public class Test {
    public static void main(String[] args){
        String strData = "2024/07/31";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date data = null;
        try {
            data = simpleDateFormat.parse(strData);
        } catch (ParseException e) {
            System.out.println("提示信息");//此时若报错会打印出提示信息
        }
        System.out.println(data);
    }
}

这种异常最容易发现,最容易修改

注意语法错误不是编译期异常

设计理念:

编译期异常 他是给程序员准备的, 我们在书写代码的时候, 有一些地方 很容易出现错误的,而且程序员也经常不注意,Java就设计了编译期异常,提示程序员“这个地方很容易出错”,目的是为了引起程序员的注意。

现在无法编译只能通过 try{}catch(){}  或者 throws 告知编译器我已经检查完代码了现在可以编译通过了

运行时异常:RuntimeException,编写代码的过程没有错误,只有代码运行起来后才会报错

1、空指针异常

public class Test {
    public static void main(String[] args){
        String str = null;
        System.out.println(str.length());
    }
}

Exception in thread "main" java.lang.NullPointerException
    at com.d729.Test.main(Test.java:10)
 

2、除数为0造成的异常

public class Test {
    public static void main(String[] args){
        int a =10;
        int b =0;
        System.out.println(a/b);
    }
}

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.d729.Test.main(Test.java:11)
 

3、索引越界异常

public class Test {
    public static void main(String[] args){
        int[] arr = {1,2,3};
        System.out.println(arr[10]);
    }
}

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
    at com.d729.Test.main(Test.java:10)

2、异常的处理

一旦发生异常,程序立刻终止

想要使得程序发生异常后我后面的代码还能正常执行

使用   try{}catch(){}

public class Test {
    public static void main(String[] args){
        int a =10;
        int b =0;
        int[] arr = {1,3};
        try{
        System.out.println(arr[10]);
        System.out.println(a/b);//此时该句不会被执行
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("除数不为0");
        }
    }
}
输出

除数不为0

public class Test {
    public static void main(String[] args){
        int a =10;
        int b =0;
        int[] arr = {1,3};
        try{
        System.out.println(a/b);
        System.out.println(arr[10]);
        }catch(ArrayIndexOutOfBoundsException e){
            System.out.println("除数不为0");
        }
    }
}

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.d729.Test.main(Test.java:14)

这里只是交换了打印语句

可以抛出更大的异常来解决

public class Test {
    public static void main(String[] args){
        int a =10;
        int b =0;
        int[] arr = {1,3};
        try{
        System.out.println(a/b);
        System.out.println(arr[10]);
        }catch(Exception e){
            System.out.println("除数不为0");
        }
    }
}

注意try里如有多个异常只能抓到第一个异常

2、finally的使用

try catch代码块中如果不出异常try中的代码会被执行完,catch中的代码不被运行,如果出现异常try中的代码块可能执行不完,但是catch中的代码会被运行,但是如果有这样一个需求,不管有没有异常都得打印某项信息,此时我们可以用到finally,(finally常被用于关闭文件流或者与数据库的链接)

无论是否出现异常都会被执行

    2.throws(多数起提示作用)

针对编译期异常,只是起提示作用,告诉编译器让代码编译通过,可以生成class文件

      针对运行时异常,throws无作用,因为不管是否用throws,都没有差别,throws的设计理念针对的是编译期异常

抛出不抛出意义不大

3、自定义异常

1、需求:创建一个Student类,Student中有name和age两个成员属性,当我们年龄输入不合法时需要抛异常

定义一个异常类,继承RuntimeException或者Exception

创建学生类

public class Student {
        private String name;
        private int age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            if(age>0 && age<=130) {
                this.age = age;
            }else{//抛出异常
                throw new MyException("年龄不合法");
            }
        }
}
创建我的异常类
public class MyException extends RuntimeException{
    public MyException(String message){//发生什么异常了
        super(message);
    }
}

测试

public class Test {
    public static void main(String[] args){
        Student student = new Student();
        student.setAge(150);
    }
}

Exception in thread "main" com.d729.MyException: 年龄不合法
    at com.d729.Student.setAge(Student.java:23)
    at com.d729.Test.main(Test.java:8)

2、自定义异常的使用场景

当Java语言提供的异常类无法满足我们的需求时,我们就可以使用自定义异常

3、自定义异常有哪些要求

   a) 自定义异常类必须要继承异常体系中的类,一般继承于Exception类和RuntimeException,只有继承异常体系中的类,该自定义类才具有可抛性,即throw关键字 

  b) 自定义异常类要提供两个构造方法,一个是无参构造器,其二是有参构造器

标签:java,String,println,Test,main,异常,public
From: https://blog.csdn.net/2301_81937222/article/details/140828559

相关文章

  • JavaSE基础 (认识String类)
    一,什么是String类在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了Strin......
  • javascript(三)
    五、事件发生在HTML元素上的事情,当在HTML页面中使用JavaScript时,JavaScript可以触发这些事件1.常用事件事件描述onchangeHTML元素改变onclick点击onmouseover鼠标移入onmouseout鼠标移出onkeydown按下键盘onload浏览器已完成页面的加载......
  • java基础知识汇总(二)
    PART1:变量与数据类型Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。整数默认:int小数默认:double使用变量注意事项:作用域:变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。相同的作用域中不能......
  • Java IO模型
    Java的IO分为两大类,一类是传统的IO(BlockingIO),一类是NIO(NewIO)。传统的IO基于字节流和字符流,以阻塞式IO操作为主。常用的类有FileInputStream、FileOutputStream、InputStreamReader、OutputStreamWriter等。这些类在读写数据时,会导致执行线程阻塞,直到操作完成。Java......
  • Java计算机毕业设计家具商城系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着人们生活水平的提高和消费观念的转变,家具作为居家生活的重要组成部分,其市场需求日益多样化与个性化。传统家具销售模式受限于地域、时间等因素,难......
  • Java计算机毕业设计家政服务网(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快和家庭结构的变化,家政服务需求日益增长,成为现代都市生活中不可或缺的一部分。然而,传统家政服务市场存在信息不对称、服务质量......
  • java -- Lambda表达式详细介绍
    java中的Lambda表达式是Java8引入的一个重要特性,它提供了一种清晰且简洁的方式来表示单个方法的接口(也被称为函数式接口)的实例。Lambda表达式使得编写匿名内部类(尤其是那些仅实现了一个方法的接口)变得更加简洁和易于理解。基本语法Lambda表达式的基本语法如下:(parameter......
  • Java计算机毕业设计健身房管理系统(开题报告+源码+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着健康意识的不断提升,健身房已成为现代人追求健康生活的重要场所。然而,随着会员数量的激增和健身项目的多样化,传统的人工管理方式已难以满足健身房......
  • Java还是C#?我该如何选择?给年轻人的建议...
    一.年轻人应该通吃其实这不应该是我们真正的主题,而且入了行的也很少会java还是c#这么比,但初学的,java和c#往往就代表了两大流派,java代替了j2ee,c#代替了.net,ok,没有关系,这么作为title,不影响我们说事。C#和Java这俩代码风格常相似,小孩子和老人才做选择,年轻人当然通吃!本人老年不正经......
  • JAVA8 collect 使用
    List<Student>studentList=Lists.newArrayList(newStudent("路飞",22,175),newStudent("红发",40,180),newStudent("白胡子",50,185),newStudent("白胡子",60,185));//最大值Optional&......