Java基础快速入门: 异常处理机制完全指南

Java小白从入门到精通,Java零基础入门看这一篇就够了 作为刚刚接触java的小白,今天这篇文章的目的是帮助大家快速入门java,少走弯路 如何快速入门Java? 一、作为刚接触Java的新手,先了解Java的基础。 Java 基本语法、Java 平台应用、Java的核心概念:JVM、JDK、JRE以及Java面向对象思想,同时要会学到如何在系统中搭建Java开发环境,以及如何利用第三方工具进行Java程序的开发。 还有记住学习Java语言最重要的是两点: 学习步骤/方法 学习资源 找到适合自己的学习方式,找到适合自己现阶段的学习资料,学习的过程中最好记笔记,. 阅读详情

本文纲要

  1. 异常体系结构和异常分类
  2. 虚拟机默认处理异常方式
  3. throws 声明异常
  4. 声明异常注意事项
  5. throw 抛出异常
  6. try … catch 自己处理异常
  7. try … catch 常见问题
  8. Throwable 成员方法
  9. 异常小练习
  10. 自定义异常

异常体系结构和异常分类

当代码出现问题时,Java 程序会以异常的形式体现。例如:

  • 数组索引越界:ArrayIndexOutOfBoundsException
  • 空指针:NullPointerException
  • 日期解析错误:ParseException

在 Java 中,异常并非语法错误(如关键字拼写错误),而是一种特殊的对象体系。所有的异常类都继承自 Throwable,其下分为两大分支:

  • Error:严重问题,程序无法处理(如内存溢出),不需要我们关心。
  • Exception:程序本身可以处理的问题,是开发者关注的重点。Exception 又分为:
    • 运行时异常:RuntimeException 及其子类,如 NullPointerException、ArrayIndexOutOfBoundsException,在编译期不强制处理。
    • 编译时异常:除 RuntimeException 之外的其他异常,如 ParseException,必须在编译期处理,否则代码无法通过编译。

Throwable

Error

Exception

RuntimeException

NullPointerException

ArrayIndexOutOfBoundsException

ArithmeticException

ParseException

IOException

演示不同类型的异常:

public class ExceptionDemo1 {
    public static void main(String[] args) throws ParseException {
        // 1. 运行时异常:数组索引越界 
        // int[] arr = {1, 2, 3, 4, 5};
        // System.out.println(arr[10]); // ArrayIndexOutOfBoundsException 
 
        // 2. 运行时异常:空指针 
        // String s = null;
        // System.out.println(s.equals("嘿嘿")); // NullPointerException 
 
        // 3. 编译时异常:日期解析异常 
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        sdf.parse("2048-1月1日"); // ParseException 
    }
}

虚拟机默认处理异常方式

程序运行过程中,当某行代码出现异常时,JVM 会做以下事情:

  1. 创建对应的异常对象。例如 new ArrayIndexOutOfBoundsException()。
  2. 检查是否有自己编写的异常处理代码。
  3. 如果没有,将异常交给本方法的调用者,最终交给虚拟机。
  4. JVM 默认处理异常会做两件事:
    • 将异常的类名、原因、位置等信息以红色字体输出在控制台。
    • 停止程序,异常位置之后的代码不再执行。
public class ExceptionDemo2 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        System.out.println(arr[10]); // 这里抛出 ArrayIndexOutOfBoundsException 
 
        // 这行代码不会执行 
        System.out.println("嘿嘿嘿,我最帅");
    }
}

throws 声明异常

throws 关键字用于在方法声明处标识可能出现的异常,本身不处理异常,而是告知调用者该方法可能产生的异常,由调用者决定如何处理。

格式:

访问修饰符 返回值类型 方法名(参数列表) throws 异常类名 {
    // 方法体 
}
public class ExceptionDemo6 {
    public static void main(String[] args) throws ParseException {
        method1(); // 调用者没有处理,最终交给虚拟机 
        method2(); // 同样交给虚拟机 
    }
 
    // 声明运行时异常,throws 可以省略不写 
    private static void method1() /throws NullPointerException/ {
        int[] arr = null;
        for (int i = 0; i < arr.length; i++) { // 这里发生空指针异常 
            System.out.println(arr[i]);
        }
    }
 
    // 声明编译时异常,必须显式写出 
    private static void method2() throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        sdf.parse("2048-10月10日");
    }
}

声明异常注意事项

编译时异常:因为编译阶段就会检查,所以必须在方法签名上显式声明,否则代码会报错。
运行时异常:在编译阶段不检查,throws 声明可以省略,即使不写,程序也能通过编译。

// 运行时异常可省略 throws NullPointerException 
private static void method1() {
    // ...
}
 
// 编译时异常必须保留 throws ParseException 
private static void method2() throws ParseException {
    // ...
}

throw 抛出异常

throw 用于在方法体内部手动抛出异常对象。一旦执行到throw,其后的代码将不再执行,异常会被交给调用者处理。

格式:

throw new 异常类名("异常信息");

使用场景:
当方法参数非法,继续运行没有意义时,应当主动抛出异常,让方法提前结束,并告知调用者问题所在。

1 ) 演进:从输出提示到抛出异常

最初的写法(不推荐):非法数据时只打印一句提示,调用者无法感知是否真正成功。

private static void printArr(int[] arr) {
    if (arr == null) {
        System.out.println("参数不能为null"); // 调用者并不知道是否成功 
    } else {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}

改进:用 throw 抛出异常,明确告知调用者

public class ExceptionDemo8 {
    public static void main(String[] args) {
        int[] arr = null;
        printArr(arr); // 这里会接收到异常,目前尚未处理,最终交给 JVM 
    }
 
    private static void printArr(int[] arr) {
        if (arr == null) {
            throw new NullPointerException(); // 手动创建并抛出异常对象 
        } else {
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    }
}

2 ) 对比 throw 和 throws:

关键字位置后面跟作用
throws方法声明处异常类名声明异常,告知调用者可能发生
throw方法体内部异常对象手动抛出异常,结束方法

try … catch 自己处理异常

若希望异常发生后程序仍能继续运行,就需要自己捕获并处理异常。

格式:

try {
    // 可能出现异常的代码 
} catch (异常类名 变量名) {
    // 出现异常后的处理代码 
}

示例:

public class ExceptionDemo9 {
    public static void main(String[] args) {
        int[] arr = null;
        try {
            printArr(arr);
        } catch (NullPointerException e) {
            System.out.println("参数不能为null");
        }
        System.out.println("嘿嘿嘿,我最帅!!!"); // 能够正常执行 
    }
 
    private static void printArr(int[] arr) {
        if (arr == null) {
            throw new NullPointerException();
        } else {
            for (int i = 0; i < arr.length; i++) {
                System.out.println(arr[i]);
            }
        }
    }
}

好处: 即使出现异常,程序不会终止,后面的代码仍可继续执行。

try … catch 常见问题

1 ) try 中没有遇到问题
会顺序执行 try 块内所有代码。
不会进入 catch 块。
执行完 try-catch 整体后,继续执行下面的代码。

2 ) try 中遇到问题
出现异常的代码之后的 try 块内代码将不再执行。
跳转到匹配的 catch 块中处理。
catch 执行完毕后,继续执行 try-catch 之后的代码。

3 ) 异常没有被捕获
如果 catch 中声明的异常类型与发生的异常不匹配,则相当于没有处理。
最终会交回给 JVM 默认处理:打印红色错误信息并终止程序。

4 ) 同时出现多个异常
可以写多个 catch 进行分别处理。
注意:如果多个异常存在子父类关系,父类异常的 catch 必须写在下方,否则子类的 catch 永远无法执行。

public class ExceptionDemo10 {
    public static void main(String[] args) {
        // 正确写法:子类异常在前,父类在后 
        try {
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入你的年龄");
            String line = sc.nextLine();
            int age = Integer.parseInt(line); // 可能产生 NumberFormatException 
            System.out.println(age);
            System.out.println(2 / 0);        // 可能产生 ArithmeticException 
        } catch (NumberFormatException e) {
            System.out.println("格式化异常出现了");
        } catch (ArithmeticException e) {
            System.out.println("数学运算异常出现了");
        }
        System.out.println("测试456");
 
        // 不推荐直接捕获 Exception 而没有针对性处理 
        /*
        try {
            // ...
        } catch (Exception e) {
            // 所有异常都用同一种方式处理,无法区分 
        }
        */
    }
}

Throwable 成员方法

所有异常类均继承自 Throwable,因此都可以调用以下三个方法:

方法说明
getMessage()返回异常的详细消息字符串
toString()返回异常的简短描述(类名 + 消息)
printStackTrace()将异常的完整堆栈跟踪以红色字体输出到控制台
public class ExceptionDemo11 {
    public static void main(String[] args) {
        try {
            int[] arr = {1, 2, 3, 4, 5};
            System.out.println(arr[10]); // 产生 ArrayIndexOutOfBoundsException 
        } catch (ArrayIndexOutOfBoundsException e) {
            // 方法一:获取消息 
            // String message = e.getMessage();
            // System.out.println(message);
 
            // 方法二:输出简短描述 
            // String s = e.toString();
            // System.out.println(s);
 
            // 方法三:打印红色错误堆栈,但程序继续执行 
            e.printStackTrace();
        }
        System.out.println("嘿嘿嘿"); // 仍然会执行 
    }
}

值得注意的是:printStackTrace() 虽然输出红色错误信息,但并不会终止程序,因此和 JVM 默认处理有本质区别。

异常小练习

需求: 键盘录入学生姓名和年龄,年龄必须介于 18~25 周岁,若不满足则要求重新录入,直到正确为止。

分析:

  1. 创建学生类 Student,在 setAge() 中加入数据校验,若不合法则抛出异常。
  2. 测试类中使用 try-catch 捕获可能出现的两种异常:数字格式异常、年龄超范围异常。
  3. 使用 while(true) 循环实现重复录入,直到数据合法后 break 跳出。
public class Student {
    private String name;
    private int age;
 
    // 构造器、getter、setter、toString 省略...
 
    public void setAge(int age) {
        if (age >= 18 && age <= 25) {
            this.age = age;
        } else {
            // 抛出自定义异常,让异常信息更见名知意 
            throw new AgeOutOfBoundsException("年龄超出了范围");
        }
    }
}
public class ExceptionDemo12 {
    public static void main(String[] args) {
        Student s = new Student();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入姓名");
        String name = sc.nextLine();
        s.setName(name);
 
        while (true) {
            System.out.println("请输入年龄");
            String ageStr = sc.nextLine();
            try {
                int age = Integer.parseInt(ageStr);
                s.setAge(age);
                break; // 赋值成功,结束循环 
            } catch (NumberFormatException e) {
                System.out.println("请输入一个整数");
            } catch (AgeOutOfBoundsException e) {
                System.out.println(e.toString());
                System.out.println("请输入一个符合范围的年龄");
            }
        }
        System.out.println(s);
    }
}

在这个练习中:

  • 校验数据 时使用 throw 抛出异常,阻止不合法的赋值。
  • 主调方法 中用 try-catch 自行处理,让程序可以重复输入,而不是直接终止。

自定义异常

当 Java 内置的异常类不能清晰表达业务含义时,就需要自定义异常。

自定义异常步骤:

  1. 定义类,类名要见名知意(如 AgeOutOfBoundsException)。
  2. 继承 RuntimeException(运行时)或 Exception(编译时),多数情况下继承 RuntimeException。
  3. 提供空参构造和带消息的构造方法。

项目结构示例:

src/
└── com/wb/exce/
    ├── AgeOutOfBoundsException.java   // 自定义异常 
    ├── Student.java                   // 学生实体类 
    └── ExceptionDemo12.java           // 测试入口 
// 自定义运行时期异常 
public class AgeOutOfBoundsException extends RuntimeException {
    public AgeOutOfBoundsException() {
    }
 
    public AgeOutOfBoundsException(String message) {
        super(message);
    }
}

在 Student 的 setAge 方法中使用:

public void setAge(int age) {
    if (age >= 18 && age <= 25) {
        this.age = age;
    } else {
        throw new AgeOutOfBoundsException("年龄超出了范围");
    }
}

当调用者捕获到 AgeOutOfBoundsException 时,就能精确知道是年龄超出范围,而不再是一个模糊的 RuntimeException,达到了异常信息见名知意的目的。

总结

以上便是 Java 异常处理机制的基础入门,从异常体系、JVM 默认处理,到两种处理方式(throws/throw 与 try-catch),再到自定义异常的编写,构成了一个完整的知识闭环

动手实践这些示例,能够帮助快速掌握异常处理的核心理念

Java编程快速入门:速成版基础知识 Java作为一种高级编程语言,自1995年由Sun Microsystems公司首次发布以来,已经成为IT行业中最受欢迎的编程语言之一。它的设计初衷是“一次编写,到处运行”,这得益于其独特的跨平台特性。Java语言的跨平台特性主要依赖于Java虚拟机(JVM),这是一种抽象的计算机,能够在不同的操作系统上执行相同的字节码。Java的成功得益于其“简单、面向对象、分布式、解释型、健壮、安全和体系结构中立”等特性。 阅读详情

相关推荐

嵌入式设备的switch 以及PHY 芯片调试和选型 (1)

越来越的设备需要多网口的需求,于是需求搭配一个交换机实现网口的扩展。但是很多软件或是硬件工程师在实际选型和应用中经常会遇到一些问题。这里总结一下,避免大家采坑。 几个概念: MAC(介质访问控制),可以理解成数据链路层即可 PHY(物理性),简单理解层转成物理层的连接组件即可 控制接口(MDC/DMIO,I2C,...

睿峰的博客 1万+

【重生之Java零基础快速入门】

Java是一种面向对象的编程语言,由Sun Microsystems于1995年发布。希望这份详细的教程能帮助你快速入门Java编程!如果有任何问题,欢迎随时提问!

z17826856787的博客 1769

ML307A模组连接ONENET平台(AT指令步骤教程)

ML307A 是一款集成度高、体积小的物联网通信模组,支持多种无线通信协议,如 LoRa、NB-IoT 等。它具有低功耗、远程通信等特点,适用于多种物联网场景。支持 LoRa 和 NB-IoT 等多种无线通信标准。提供丰富的 GPIO 接口。内置多种传感器支持。UART 接口:用于与微控制器或其他设备通信。GPIO 接口:可以连接外部传感器或执行器。电源接口:用于供电。OneNET 是中国移动推出的一款物联网开放平台,它提供了从数据采集、存储到分析的一站式解决方案。

xiewengeng的博客 5484

java快速入门

Java 集合框架主要由两大接口派生而出:Collection 和 Map。Collection 接口用于存储单个元素,而 Map 接口用于存储键值对。集合框架提供了统一的接口和方法,方便开发者对不同类型的集合进行操作,同时也提高了代码的可复用性和可维护性。

m0_74013450的博客 1424

Reactor 响应式编程(第一篇:Reactor核心)

响应式:响应式编程: 全异步、消息、事件回调默认还是用当前线程,生成整个流、发布流、流操作.log();//只要不指定线程池,默认发布者用的线程就是订阅者的线程;

moments的博客 1573

类银河恶魔城游戏开发学习笔记(0)

解决B站搬运【Unity教程】从0编程制作类银河恶魔城游戏P37中moveState和idleState循环切换的问题

Gellar的博客 1448

有Java基础快速入门Python

学习Python第一天学习准备语法基础一,了解python二,Python解释器三,标识四,数据类型五,运算符六,控制语句七,格式化输出八,Number(数字)九,字符串SmartyPants 学习准备 因为之前系统学习过Java语言,所以这次学习Python想脱离完整视频教学,通过以前总结的经验来快速入门Python。打算边学习语法基础,边编写demo,最后实现完整的项目来实现python入门。语言只是实现目的的工具,工具就是用来使用的,只有不断的运行测试才能发现自己的不足,Make it run, ma

qq_40661404的博客 4270

OpenFOAM-多孔介质模型(porous media)

文章目录一、多孔介质(porous media)二、使用步骤1.达西定律2.Darcy-Forchheimer3.OpenFOAM fvOptions4.paraview动画每帧显示时间(Annotate Time)5.参考内容总结 一、多孔介质(porous media) 在流体力学中,流体流经多孔介质是指流体流经多孔介质时的行为方式,如海绵或木材,或使用沙子或其他多孔材料过滤水。 我们将展示如何设置多孔层,并使用OpenFOAM模拟流体通过该介质。 二、使用步骤 1.达西定律 达西定律最初是由达西通.

zq93538196的博客 9939

【Python】快速入门Python一天学完基础语法

快速入门python 1. 数据类型与变量:元组、字典、拆包等 2. 基础运算与控制流程 3. 方法/函数、异常处理 4. 面向对象

CoderSharry的博客 2351

LabVIEW与MySQL实时数据存储:传感器采集与数据库同步实践

本文详细介绍了如何将LabVIEW与MySQL结合,实现传感器数据的实时采集与高效存储。通过设计合理的数据库表结构、配置LabVIEW数据库连接工具包,并编写核心的采集与存储VI,构建了稳定可靠的数据链路。文章重点分享了批量插入、连接管理、时间同步等关键优化技巧与避坑指南,帮助工程师应对工业监控、环境监测等场景下的实时数据同步挑战。

weixin_29281915的博客 262

SAP ABAP CO核心扩展-为企业定制ZCKM3N物料价格分析增强(CKM3 CKM3N CKM8N)

这篇文章,将为大家讲述物料价格分析扩展增强(ZCKM3N)的方法和原理,并基于CKM3N的视图之一“CV成本组件”,教大家如何一步步实现批量输出多工厂物料的物料价格分析报表。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 3987

Java:Java快速入门

包的名字和项目路径下的目录路径相对应,比如:项目路径为:C:\Study,有一个Java源文件位于:C:\Study\com\happyframework\study\App.java,那么App.java的包名字必须为:com.happyframework.study,且 App.java 的第一行语句必须为:package com.happyframework.study。Java中所有的赋值和方法调用都是“按值“处理的,引用类型的值是对象的地址,原始类型的值是其自身。

woaimx_1314的博客 5293

SAP-ABAP:SAP中的用户确认对话框:深入理解与实践POPUP_TO_CONFIRM

本文深入介绍了SAP中的用户确认对话框函数POPUP_TO_CONFIRM,包括其核心参数配置、返回值处理、应用场景和最佳实践。该函数是SAP二次开发中重要的交互工具,用于关键操作前获取用户确认,防止误操作。文章详细解析了参数设置技巧,强调必须全面处理所有可能的返回值,并提供了删除数据、批量操作等典型应用场景的代码示例。同时对比了其他类似弹出函数,帮助开发者选择合适工具。正确使用该函数可提升系统安全性、改善用户体验并符合SAP设计规范。

baidu_35680696的博客 970

Java如何快速入门?Java基础_Java入门

小编认为对接触Java的小白来说,最担心的应该就是Java怎么学,都需要掌握哪些内容?今天这篇文章希望能帮助大家快速入门Java,少走弯路! 一、作为刚接触Java的新手,肯定要先了解Java的基础。 Java 基本语法、Java 平台应用、Java的核心概念:JVM、JDK、JRE以及Java面向对象思想,同时要会学到如何在系统中搭建Java开发环境,以及如何利用第三方工具进行Java程序的开发。 学习Java语言最重要的是:学习步骤和方法 只要找到适合自己的学习方式,找到适合自己现阶段的学习资料

m0_46184557的博客 4481

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java 异常处理机制详解

在 Java 编程中,异常处理是一个至关重要的概念。它帮助我们处理程序执行过程中可能出现的错误或异常情况,从而提高程序的可靠性和稳定性。本文将详细介绍 Java 异常处理机制,包括异常的定义、分类、处理方式以及一些最佳实践。

专注Java和MySQL领域知识分享 1991

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

scala快速入门系列【异常处理】

        本篇作为scala快速入门系列的第三十三篇博客,为大家带来的是关于异常处理的内容。 文章目录捕获异常抛出异常示例 | 抛出异常         先让我们来看看一段代码     &...

大数据梦想家 2231

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

2025 Java异常处理完全指南:零基础入门与AI辅助调试

在Java编程中,异常处理是一项至关重要的技能。它不仅能够帮助我们优雅地处理程序运行过程中出现的错误,还能提高程序的健壮性和可维护性。对于Java零基础学习者来说,掌握异常处理机制是成为一名优秀Java开发者的必经之路。2025年,随着AI技术的发展,AI辅助调试已经成为异常处理的新趋势,可以帮助开发者更快速、更准确地定位和解决问题。

欢迎来到智能安全前线!这里是AI与信息安全交汇之地。我们以代码为武器,深入大模型攻防实战,破解系统漏洞。追踪OpenAI、Meta前沿动态,用红蓝对抗思维,锻造智能时代的坚盾与利矛。 836

Java-入门指南(零基础入门)

第二章、数据类型及变量 标识符 关键字 数据类型 进制转换 ​提升转换不丢失精度;(type)var强制类型转换 变量 实例变量:在堆中。 静态变量:在方法区。 局部变量:在栈中。 以上三大变量中:局部变量永远都不会存在线程安全问题。堆和

qq_61673686的博客 1933

Java编程基础:DSA-Bootcamp-Java入门指南

Java编程基础:DSA-Bootcamp-Java入门指南 本文是Java编程基础的入门指南,全面介绍了Java开发环境的配置、数据类型与变量、条件语句与循环结构、函数方法定义与作用域管理等核心内容。从JDK安装配置、第一个Java程序编写,到数据类型体系、变量声明初始化,再到条件判断、循环控制,最后深入探讨函数设计原则、作用域管理和参数传递机制。通过丰富的代码示例和实战案例,帮助读者系统掌握J...

gitblog_00133的博客 1096

Java入门指南:从零开始掌握编程基础——Java初识

Java作为面向对象编程语言,凭借"一次编写,到处运行"的跨平台特性成为编程入门首选。文章详细解析了Java的核心优势:通过JVM实现跨平台运行、简化语法设计、自动内存管理等特性,对比了与C语言的差异。同时提供了开发环境搭建指南,包括JDK安装配置、IDE选择建议(IntelliJ IDEA/Eclipse),并演示了首个HelloWorld程序的编写运行流程。针对初学者常见问题给出解决方案,最后推荐了持续学习路径。文章系统性地介绍了Java从原理到实践的完整知识框架,帮助编程新手快速建

qq_49729896的博客 1443

Java零基础快速入门

这篇Java基础复习笔记系统整理了Java核心知识点,主要包含以下内容: 核心特性:封装(属性私有+公共方法)、继承(IS-A关系)、多态(编译时重载/运行时重写)三大面向对象特性,以及编译运行机制。 基础语法:访问权限控制、开发环境组成、8种基本数据类型与缓冲池机制、字符串特性与相关类对比、变量分类及运算符使用。 关键字解析:final(不可变性)、static(类共享成员)、this/super(对象引用)、instanceof(类型判断)等关键字的用法和限制。 面向对象核心:类与对象关系、继承与重写规

weixin_47759174的博客 694

JAVA快速入门

Java程序运行 步骤:编写源代码,编译源代码,装载,校验,运行 Java语言的特点: ①平台无关性(一次编写,随处运行 ) ②面向对象(封装,继承,多态) ③健壮性(鲁棒性,强类型机制,异常处理机制,抛弃指针) ④分布式 ⑤多线程(多线程编程,允许程序中多个任务并发执行,提供同步机制允许共享数据) ⑥动态性(允许程序动态地装人运行过程中所需要的类;也可以通过网络来载入所需要的类,能进行运行时的类型检查) 第一个Java程序 public class HelloWorld{ p

zsxdg的博客 2231

JAVA基础面试题:Java中的异常处理机制与最佳实践

Java的异常处理机制是保证程序健壮性的重要手段,合理使用异常处理可以显著提高代码的可靠性和可维护性。在实际开发中,应该遵循最佳实践,结合业务场景设计健壮的异常处理策略。Victor的回答让面试官频频点头,显然对他的表现非常满意。

qq_61302385的博客 863

Java 开发者的 Python 快速入门指南

JavaPythonPython 使用缩进来定义代码块,不需要花括号Python 不需要分号结尾Python 不需要显式声明类(除非必要)

Seachal的博客 1295

如何快速入门Java

遇到瓶颈时,可通过“拆解问题→分步实现”降低难度(如将“图书管理系统”拆分为“数据存储”“用户交互”“业务逻辑”模块)。- Java SE核心类:String、ArrayList、HashMap、File(文件操作)、IO流(读写文件)。- IDE安装:IntelliJ IDEA(主流)或Eclipse,学会创建项目、调试代码(打断点、查看变量)。- 核心目标:掌握Java语法规则、数据类型、运算符、流程控制(if/for/while)、数组等基础要素。

darling_798的博客 1260
上一篇: Java基础快速入门: 数组高级操作与算法基础
下一篇: Java基础快速入门:集合入门
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值