首页 > 编程语言 >Java之异常

Java之异常

时间:2023-07-30 18:11:06浏览次数:26  
标签:Java System 编译 println 异常 public out

Java之异常

概述

异常是什么?

异常是代码在编译或者执行的过程中可能出现的错误

异常分为几类?

  1. 编译时异常、运行时异常。

  2. 编译时异常:没有继承RuntimeExcpetion的异常,编译阶段就会出错。

  3. 运行时异常:继承自RuntimeException的异常或其子类,编译阶段不报错,运行可能报错。

学习异常的目的?

避免异常的出现,同时处理可能出现的异常,让代码更稳健。

 

运行时异常

直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能出现的错误。

一般是指程序员业务没有考虑好或者是编程逻辑不严谨引起的错误。

事例

  1. 数组索引越界异常:ArraylndexOutofBoundsException

  2. 空指针异常:NullPointerException,直接输出没有问题,但是调用空指针的变量的功能就会报错

  3. 数学操作异常: ArithmeticException

  4. 类型转换异常: ClassCastException

  5. 数字转换异常: NumberFormatException

 

编译时异常

不是RuntimeException或者其子类的异常,编译阶就报错,必须处理,否则代码不通过

示例

 String date = "2015-01-12 14:27:56";
 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 Date d = sdf.parse(date); //日期解析异常
 System.out.println(d);

作用

  1. 是担心程序员的技术不行,在编译阶段就爆出一个错误,目的在于提醒不要出错!

  2. 编译时异常是可遇不可求。遇到了就遇到了呗。

 

异常处理机制

默认异常处理机制

  1. 默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。

  2. 异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机

  3. 虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据

  4. 直接从当前执行的异常点干掉当前程序

  5. 后续代码没有机会执行了,因为程序已经死亡。

 public static void main(String[] args) {
         System.out.println("程序开始===========");
         divide(10,0);
         System.out.println("程序结束===========");
     }
     public static void divide(int a , int b){
         System.out.println(a);
         System.out.println(b);
         int c = a / b;
         System.out.println(c);
     }

默认的异常处理机制并不好,一旦真的出现异常,程序立即死亡!

编译时异常处理机制

  1. 出现异常直接抛出去给调用者,调用者也继续抛出去 (throws)

  2. 出现异常自己捕获处理,不麻烦别人 (try-catch)

  3. 前两者结合,出现异常直接抛出去给调用者,调用者捕获处理 (两者结合)

 

throws

用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理.

这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程席死亡

 

格式:
 方法 throws 异常1,异常2,异常3...{
 }
规范做法:
 方法 throws Exception{
 }

 

 public static void main(String[] args) throws Exception {
     System.out.println("程序开始========");
     parseTime("2023-07-30 14:42:15");
     System.out.println("程序结束========");
 }
 ​
     private static void parseTime(String date) throws Exception {
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         Date d = sdf.parse(date);
         System.out.println(d);
 ​
         InputStream i = new FileInputStream("C:/auif.jdg");
     }

 

try-catch

  1. 监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理

  2. 这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。

格式:
 try{
     // 监视可能出现异常的代码!
 }catch(异常类型1 变量){
     //处理异常
 }catch(异常类型2 变量){
     //处理异常
 }...

 

建议格式:
 try{
     //可能出现异常的代码!
 }catch(Exception e){
     e.printStackTrace(); //直接打印异常栈信息
 }...
 Exception 可以捕获处理一切异常类型!

代码:

 try {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             Date d = sdf.parse(date);
             System.out.println(d);
 ​
             InputStream i = new FileInputStream("C:/auif.jdg");
         }
         catch (Exception e) {
             e.printStackTrace();//打印异常栈信息

 

throws 和try-catch结合

 public static void main(String[] args) {
         System.out.println("程序开始========");
         try {
             parseTime("2023-07-30 14:42:15");
             System.out.println("功能操作成功");
         } catch (Exception e) {
             e.printStackTrace();
             System.out.println("功能操作失败");
         }
         System.out.println("程序结束========");
     }
     private static void parseTime(String date) throws Exception {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
             Date d = sdf.parse(date);
             System.out.println(d);
 ​
             InputStream i = new FileInputStream("C:/auif.jdg");
     }

自定义异常

1、自定义编译时异常

  1. 定义一个异常类继承Exception.

  2. 重写构造器。

  3. 在出现异常的地方用throw new 自定义对象抛出

  4. 作用:编译时异常是编译阶段就报错,醒更加强烈,一定需要处理!!

代码实现

  1. 自定义的异常类

 public class IthengAgeIlleagalException extends Exception{
 ​
     public IthengAgeIlleagalException() {
     }
 ​
     public IthengAgeIlleagalException(String message) {
         super(message);
     }
 }
  1. Test类

 public class ExceptionDemo {
     public static void main(String[] args) {
         try {
             checkAge(-34);
         } catch (IthengAgeIlleagalException e) {
             e.printStackTrace();
         }
     }
     public static void checkAge(int age) throws IthengAgeIlleagalException {
         if (age < 0 || age >200){
             //抛出去一个异常
             //throw:  在方法内部直接创建一个异常对象,并从此点抛出
             //throws: 用在方法申明上的,抛出方法内部的异常
             throw new IthengAgeIlleagalException(age + " is illegal");
         }else{
             System.out.println("年龄合法,给其推荐商品");
         }
     }
 }

 

2、自定义运行时异常

  1. 定义一个异常类继承RuntimeException

  2. 重写构造器

  3. 在出现异常的地方用throw new 自定义对象抛出!

  4. 作用:提醒不强烈,编译阶段不报错!!运行时才可能出现!!

代码实现

  1. 自定义的运行时异常类

 public class IthengAgeRuntimeException extends Exception{
 ​
     public IthengAgeRuntimeException() {
     }
 ​
     public IthengAgeRuntimeException(String message) {
         super(message);
     }
 }
  1. Test类

 public static void main(String[] args) {
         try {
             checkAge(-34);
         } catch (IthengAgeRuntimeException e) {
             e.printStackTrace();
             System.out.println("出错了");
         }
     }
     
         public static void checkAge(int age) throws IthengAgeRuntimeException{
             if (age < 0 || age > 200) {
                 throw new IthengAgeRuntimeException(age + " is illegal");
             } else {
                 System.out.println("年龄合法,给其推荐商品");
             }
         }
 

标签:Java,System,编译,println,异常,public,out
From: https://www.cnblogs.com/liandaozhanshi/p/17591789.html

相关文章

  • java中判断图片格式并且等比例压缩图片
    最近项目中需要判断上传的图片必须是png,jpg,gif三种格式的图片,并且当图片的宽度大于600px时,压缩图片至600px,并且等比例的压缩图片的高度。具体的实现形式:大致的思路是:判断根据文件名判断图片的格式是否是png,jpg,gif三种图片文件  定义了 方法如果是的,则进入到scaleImage(Stri......
  • 关于Java的多线程实现
    多线程介绍进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以......
  • JAVA实现海报背景填充qrCode
    packagecom.open.openbank.qrCode;importjavax.imageio.ImageIO;importjava.awt.*;importjava.awt.geom.RoundRectangle2D;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;/***生成海报*/publicclassPosterTest{......
  • java基础中(笔记)
    流程控制流程控制语句的分类:1、顺序结构:从上往下,从前往后;2、分支结构(if,switch);3、循环结构(for,while,do...while); if语句if格式:if(关系表达式){语句体;}if(关系表达式){语句体1;}else{语句体2;}if(关系表达式){语句体1;}elseif{语句体2;}elseif{语句体3;}elseif{语......
  • Java 中 == 与 equals() 的区别
    Java中==与equals()的区别1.====是一个比较运算符,在使用时有可以判断两种情况在用于基本类型时,即判断两边数据的值是否相等。在用于引用类型时,即判断两边是否为同一个对象即有相同的地址。2.equals()方法equals()方法是Object的一个方法,只能判断引用类型。O......
  • 懒得改变原始对象?JavaScript代理模式教你怎样一步步偷懒!
    前言系列首发于公众号『非同质前端札记』,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。懒得改变原始对象?JavaScript代理模式教你怎样一步步偷懒!何为代理模式例如,你想预约一家公司的董事长会面,按照正常流程,你只能通过先联系他的秘书,然后跟他的秘书预约时间,约好时......
  • Java利用Rxtx进行串口通讯
    最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了。那么问题来了,如何进行串口通讯呢?老板说你用Java写个程序好了嘛,用Java写串口程序也是醉了。实验室也没别人写了,所以就......
  • java基础上(笔记)
    变量变量:程序运行过程中,其值可以发生改变的量。变量由三部分组成:变量名、变量值、数据类型。格式:数据类型变量名=变量值;如:inta=10;(定义变量)变量的使用:取值与修改值。取值格式:变量名修改格式:变量名=变量值;注意事项:不能定义已存在的变量;不能使用未定义的变量;整数默认最大......
  • Java概述
    第一章·内容介绍......
  • JavaScript学习 -- 对称加密算法DES
    在现代的互联网时代,数据安全性备受关注。为了保护敏感数据的机密性,对称加密算法是一种常用的方法。在JavaScript中,DES(DataEncryptionStandard)是一种常用的对称加密算法。本篇博客将为您展示如何在JavaScript中使用DES算法进行加密和解密,并提供一个实际的例子。首先,我们需要使用Cr......