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

Java---异常

时间:2023-10-02 17:04:56浏览次数:34  
标签:Java int System --- catch println 异常 out

14.1 概念

在日常编码中或多或少都会现一些问题,这些问题有的是错误和有的是异常(不正常)。

日常编码这种问题分为两类:

1、错误 Error

2、异常 Exception

Java---异常_Java

错误在jvm,硬件层面报出的问题

异常是代码运行层面

bug:

1、编码语法错误(很好解决)

2、运行时异常 这种异常也好解决,根据提示去做修改方案

3、运算结果没有达到预期结果。 这种问题需要去查看代码逻辑,断点调试,观察变量数据变化。

14.2 异常 :

Exception: 是所有异常种类的父类

RuntimeException : 运行时异常 可以不用人为的去处理,JVM会自动处理

检测性运行时异常: 必须要人为手工处理,不处理程序写不下去 。

14.3 RuntimeException

Java 根据各个类库也定义了一些其他的异常,下面的表中列出了 Java 的非检查性异常。

异常

描述

ArithmeticException

当出现异常的运算条件时,抛出此异常。例如,一个整数"除以零"时,抛出此类的一个实例。

ArrayIndexOutOfBoundsException

用非法索引访问数组时抛出的异常。如果索引为负或大于等于数组大小,则该索引为非法索引。

ArrayStoreException

试图将错误类型的对象存储到一个对象数组时抛出的异常。

ClassCastException

当试图将对象强制转换为不是实例的子类时,抛出该异常。

IllegalArgumentException

抛出的异常表明向方法传递了一个不合法或不正确的参数。

IllegalMonitorStateException

抛出的异常表明某一线程已经试图等待对象的监视器,或者试图通知其他正在等待对象的监视器而本身没有指定监视器的线程。

IllegalStateException

在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。

IllegalThreadStateException

线程没有处于请求操作所要求的适当状态时抛出的异常。

IndexOutOfBoundsException

指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。

NegativeArraySizeException

如果应用程序试图创建大小为负的数组,则抛出该异常。

NullPointerException

当应用程序试图在需要对象的地方使用 null 时,抛出该异常

NumberFormatException

当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。

SecurityException

由安全管理器抛出的异常,指示存在安全侵犯。

StringIndexOutOfBoundsException

此异常由 String 方法抛出,指示索引或者为负,或者超出字符串的大小。

UnsupportedOperationException

当不支持请求的操作时,抛出该异常。

下面的表中列出了 Java 定义在 java.lang 包中的检查性异常类。

异常

描述

ClassNotFoundException

应用程序试图加载类时,找不到相应的类,抛出该异常。

CloneNotSupportedException

当调用 Object 类中的 clone 方法克隆对象,但该对象的类无法实现 Cloneable 接口时,抛出该异常。

IllegalAccessException

拒绝访问一个类的时候,抛出该异常。

InstantiationException

当试图使用 Class 类中的 newInstance 方法创建一个类的实例,而指定的类对象因为是一个接口或是一个抽象类而无法实例化时,抛出该异常。

InterruptedException

一个线程被另一个线程中断,抛出该异常。

NoSuchFieldException

请求的变量不存在

NoSuchMethodException

请求的方法不存在

14.4 异常处理
  • 1、try{...}catch(Exception e){....}finally{...}结构
    用于你觉得可能会出现异常的代码段。
    try{正常的业务功能逻辑}
    catch(异常类 对象){写你对这个异常的处理}, 所以catch小括号中就是在定义一个异常类的对象,而catch代码块中就是用这个异常对象来处理异常
catch (InputMismatchException ex){
            ex.getMessage();  //获取异常信息
            ex.printStackTrace();//打印堆栈信息

}

catch可以写很多个,用于处理try中出现的不同种类的异常

try {
            Scanner input = new Scanner(System.in);
            System.out.println("请输入第一个数:");
            int n1 = input.nextInt();
            System.out.println("请输入第二个数:");
            int n2 = input.nextInt();
            int result = n1 / n2;
            System.out.println(result);
        }catch (InputMismatchException ex){
            ex.getMessage();  //获取异常信息
            ex.printStackTrace();//打印堆栈信息

        }catch(ArithmeticException ex){
            ex.printStackTrace();
        }catch (ArrayIndexOutOfBoundsException ex){
            ex.printStackTrace();
        }catch (NullPointerException ex){
            ex.printStackTrace();
        }

这种写法比较精准的去捕捉异常信息

try {
            Scanner input = new Scanner(System.in);
            System.out.println("请输入第一个数:");
            int n1 = input.nextInt();
            System.out.println("请输入第二个数:");
            int n2 = input.nextInt();
            int result = n1 / n2;
            System.out.println(result);
        }catch (RuntimeException ex){
            ex.getMessage();  //获取异常信息
            ex.printStackTrace();//打印堆栈信息

        }
        System.out.println("程序结束");

这样可以捕捉所有的异常

finally{...}无论程序走不走catch最后都要执行finally中的代码

try {
            Scanner input = new Scanner(System.in);
            System.out.println("请输入第一个数:");
            int n1 = input.nextInt();
            System.out.println("请输入第二个数:");
            int n2 = input.nextInt();
            int result = n1 / n2;
            System.out.println(result);
        }catch (RuntimeException ex){
            ex.getMessage();  //获取异常信息
            ex.printStackTrace();//打印堆栈信息

        }finally {
            System.out.println("程序结束");
        }

try,catch,finally 可以怎么组合呢?

可以只写try...catch()...

也可以只写try....finally... 这样结构说白了就是没有的异常的捕捉

public static void main(String[] args) {
        try {
            Scanner input = new Scanner(System.in);
            System.out.println("请输入第一个数:");
            int n1 = input.nextInt();
            System.out.println("请输入第二个数:");
            int n2 = input.nextInt();
            int result = n1 / n2;
            System.out.println(result);
        }finally {
            System.out.println("程序结束");
        }
    }
//以前出了异常程序后终断执行,现在出了异常程序也会终断执行,但是会先将finally中的代码执行完后再终断

不能没有try。

  • 2、如果某个方法有异常的代码段我不处理这个异常,转交给调用处进行处理
    语法 :
    public void 方法名() throws Exception(异常类名){
    }
    异常向外抛。
14.5 创建一个自定异常

创建一个自定异常也叫抛出一异常。

语法: thorw new 异常类("异常提示信息"); 这就是抛出一个异常让别人去处理

public class Main {
    public static void main(String[] args) {

            Scanner input = new Scanner(System.in);
            System.out.println("请输入第一个数:");
            int n1 = input.nextInt();
            System.out.println("请输入第二个数:");
            int n2 = input.nextInt();
        //这里没有系统要处理异常的提示,人家不知道处理。有可能在不知情的情况下就出错了,程序就会中断执行
            int result = calc(n1,n2); 
            System.out.println(result);
            System.out.println("程序结束");

    }

    public static int calc(int num1,int num2){
        if(num2==0){
            throw new RuntimeException("除整不能为0");//抛出一个RuntimeException运行时异常这种系统不会进行检测
        }
        int result= num1/num2;
        return result;
    }
}

自已创建一个异常来自定义这种检测性的异常

ReflectiveOperationException这一个类是检测性的异常类
/*
继承这个检测性的异常类后就拥有了检测的性能 继承于Exception ,Exception又继承于Throwable类
在Throwable这个类中有getMessage和printStackTrace两个,功能方法,所以我自定义的这个类也继承下来了这两个方法 ,并且异常类可以
设置自己想给出的提示信息,在每个父类 都有接收message这个参数的构造 ,这个是将自定义异常信息一层一层的往上传,最后传到了Throwable类中,设置异常提示信息。所以,我们想自定义异常类设置提示信息,一样要住上传。
*/
//运算除数不能为0异常类
public class ZroeArithmeticException extends Exception {
    public ZroeArithmeticException(String message) {
        super(message);
    }
}
package com.qf.throwdemo;

import com.qf.throwClass.ZroeArithmeticException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

            Scanner input = new Scanner(System.in);
            System.out.println("请输入第一个数:");
            int n1 = input.nextInt();
            System.out.println("请输入第二个数:");
            int n2 = input.nextInt();
        int result = 0;
        try {
            //系统检测到异常,不处理不行,必须要使用tr...catch处理,或者也往外抛,交给了main方法 ,交jvm处理,jvm遇到异常就会中断程序的执行
            result = calc(n1,n2);
        } catch (ZroeArithmeticException e) {
            e.printStackTrace();
        }
        System.out.println(result);
            System.out.println("程序结束");

    }

    public static int calc(int num1,int num2) throws ZroeArithmeticException {
        if(num2==0){
            //这是自定义的检测型异常必须要处理,如果这在抛出异常这里使用了try..catch处理后,以调用者没有警示意义,所以这里不处理,异常向外继承抛,交由调用者来处理
            throw new ZroeArithmeticException("除整不能为0"); 
        }
        int result= num1/num2;
        return result;
    }
}

标签:Java,int,System,---,catch,println,异常,out
From: https://blog.51cto.com/u_16261728/7683759

相关文章

  • 文心一言 VS 讯飞星火 VS chatgpt (104)-- 算法导论10.1 2题
    二、用go语言,说明如何在一个数组A[1..n]中实现两个栈,使得当两个栈的元素个数之和不为n时,两者都不会发生上溢。要求PUSH和POP操作的运行时间为O(1)。文心一言:在这个问题中,我们要在一个数组A[1..n]中实现两个栈,使得当两个栈的元素个数之和不为n时,两者都不会发生上溢。这......
  • uview 中的 `u-line-1`原理
    uview中的u-line-1原理//超出行数,自动显示行尾省略号,最多5行//来自uView的温馨提示:当您在控制台看到此报错,说明需要在App.vue的style标签加上【lang="scss"】@for$ifrom1through5{ .u-line-#{$i}{ /*#ifdefAPP-NVUE*/ //nvue下,可以直接使用lines属性,这是......
  • 洛谷 P5811 - [IOI2019] 景点划分
    小清新构造题。不妨假设\(a\leb\lec\)。显然我们会让大小为\(a,b\)的部分连通,这样肯定是不劣的。建出DFS树,考虑其重心\(r\),如果\(r\)的某个子树大小\(\gea\),我们在这个子树内挑一个大小为\(a\)的连通块,在抠掉这个子树之外的部分挑一个大小为\(b\)的连通块即可。......
  • 文心一言 VS 讯飞星火 VS chatgpt (104)-- 算法导论10.1 2题
    二、用go语言,说明如何在一个数组A[1..n]中实现两个栈,使得当两个栈的元素个数之和不为n时,两者都不会发生上溢。要求PUSH和POP操作的运行时间为O(1)。文心一言:在这个问题中,我们要在一个数组A[1..n]中实现两个栈,使得当两个栈的元素个数之和不为n时,两者都不会发生上溢。......
  • Leaf-美团的分布式ID生成器
    简介在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯......
  • [官方培训]10-UE实时渲染后期 李文磊 Epic 笔记
    实时渲染后期什么是后期需求:快速地基于镜头对最终画面内容及形式(节奏,色调,气氛)的控制传统后期:像素UE后期:像素和对象UE后期UE后期对象:对象和像素(Buffer)对象调节:光影,材质,特效,雾效,Sequencer像素Buffer处理:AA,相机及镜头效果,ColorGrading,Tonemapping,PPM,Decal,Translucency,Compo......
  • [官方培训]09-UE粒子基础 肖月 Epic 笔记
    UE粒子基础我们将讨论Niagara的基础操作和框架Module>Emitter>SystemGamethread.RenderthreadCustomModuleSequencer,DebuggerDataSharingAttribute,DataInterface场景交互,碰撞粒子间交互Event,AttributeReaderNiagaraFluidGridCollectionsGasExamp......
  • [官方培训]08-UE动画基础 戴浩军 Epic 笔记
    UE动画基础UE动画概述UE动画功能强大,复杂,灵活不同类型项目对动画系统应用范围各不相同“动画”作为一个宽泛概念,在引擎中有多种实现方式,需要灵活选择影视CG相关常见动画种类浏览骨骼网格体动画(动画序列,变形目标,动画曲线,PoseAsset)物理动画(刚体,布料,破碎,实时毛发模拟)顶点......
  • [官方培训]07-UE材质基础 孙丹璐 Epic 笔记
    UE材质基础什么是材质定义了场景中对象的表面属性决定光源是如何与物体表面交互反射——漫反射,镜面反射折射透射本质上应用于Mesh并控制Mesh的视觉外观固体——塑料,岩石,木板,铁块...次表面——皮肤,树叶,玉石...透明——玻璃,水基于物理-PBR(PhysicallyBasedRendering......
  • 权限提升-Windows内核提权
    权限提升-Windows内核提权目录权限提升-Windows内核提权本节知识点系统内核溢出漏洞提权概述内核溢出提权步骤补丁对比法1.手动查找系统补丁2.对比查找系统潜在漏洞项目一:WindowsExploitSuggester项目二.WindowsVulnScan项目三wesng3.提权大集合项目地址:https://github.com/l......