自定义异常类:

自定义异常类的步骤:自定义一个类继承Exception即可

  1. public class CustomClass {
  2.  
  3. public static void main(String[] args) throws NoIpException{
  4. // TODO Auto-generated method stub
  5. String ip=null;
  6. feiQ(ip);
  7. }
  8. public static void feiQ(String ip) throws NoIpException{
  9. if (ip==null) {
  10. //抛出一个没有网线的异常
  11. throw new NoIpException("没有插网线啊");
  12. }
  13. System.out.println("正常显示好友列表!");
  14. }
  15. }
  16. class NoIpException extends Exception{
  17. public NoIpException() {}
  18. public NoIpException(String message) {
  19. super(message); //调用了Exception一个参数的构造函数
  20. }
  21. }
  22.  
  23. 结果:
  24. Exception in thread "main" test.NoIpException: 没有插网线啊 //这里会出现这样的结果是因为我们把上面的异常抛给了feiQ的调用者main函数,也就是jvm,它会默认打印异常的栈信息的,所以会出现下面的东西
  25. at test.CustomClass.feiQ(CustomClass.java:13)
  26. at test.CustomClass.main(CustomClass.java:8)

还可以用try-catch方法:

  1. public class CustomClass {
  2.  
  3. public static void main(String[] args) /*throws NoIpException*/{
  4. // TODO Auto-generated method stub
  5. String ip=null;
  6. try {
  7. feiQ(ip);
  8. }catch(NoIpException e) {
  9. e.printStackTrace();
  10. System.out.println("马上插上网线!");
  11. }
  12. }
  13. public static void feiQ(String ip) throws NoIpException{
  14. if (ip==null) {
  15. //抛出一个没有网线的异常
  16. throw new NoIpException("没有插网线啊");
  17. }
  18. System.out.println("正常显示好友列表!");
  19. }
  20. }
  21. class NoIpException extends Exception{
  22. public NoIpException() {}
  23. public NoIpException(String message) {
  24. super(message); //调用了Exception一个参数的构造函数
  25. }
  26. }
  27.  
  28. 结果:
  29. test.NoIpException: 没有插网线啊
  30. at test.CustomClass.feiQ(CustomClass.java:18)
  31. at test.CustomClass.main(CustomClass.java:9)
  32. 马上插上网线!

例题:定义一个没钱的异常    ,如果带够了钱,那么就可以吃上木桶饭,如果没有,那么就会抛出一个没钱的异常。

  1. public class CustomClassTest {
  2.  
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. int money=6;
  6. try {
  7. eat(money);
  8. }catch(NoMoneyException e) {
  9. e.printStackTrace();
  10. System.out.println("跟我洗碗一个月!");
  11. }
  12. }
  13. public static void eat(int money) throws NoMoneyException{
  14. if (money<10) {
  15. //抛出一个没有钱的异常
  16. throw new NoMoneyException("吃霸王餐!");
  17. }
  18. System.out.println("吃上了香喷喷的木桶饭!");
  19. }
  20. }
  21. //定义一个没钱的异常
  22. class NoMoneyException extends Exception{
  23. public NoMoneyException() {}
  24. public NoMoneyException (String message) {
  25. super(message);
  26. }
  27. }
  28.  
  29. 结果:
  30. test.NoMoneyException: 吃霸王餐!
  31. at test.CustomClassTest.eat(CustomClassTest.java:18)
  32. at test.CustomClassTest.main(CustomClassTest.java:9)
  33. 跟我洗碗一个月!

异常分为:

    运行时异常:如果一个方法内部抛出了一个运行时异常,那么方法上可以声明也可以不声明,调用者可以处理也可以不处理

    编译时异常(非运行时异常,受检异常) :如果一个方法内部抛出了一个编译时异常对象,那么方法上就必须要声明,而且调用者也必须要处理。

运行时异常:RuntimeException以及RuntimeException子类都是属于运行时异常

编译时异常:除了运行时异常就是编译时异常。

疑问:为什么java编译器会如此严格要求编译时异常,对运行时异常如此宽松?

    运行时异常都是可以通过程序员良好的编程习惯去避免的,所以java编译器就没有严格要求处理运行时异常

    而编译时异常是不能通过代码来避免的,所以就必须要求程序员来处理

资源文件一旦使用完毕,一定要释放资源文件,否则其他的程序无法对这个资源文件进行操作。

finally块:

finally块的使用前提是必须要存在try块才能使用

  1. public class Finally {
  2.  
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. div(4,0);
  6. }
  7. public static void div(int a,int b) {
  8. try {
  9. int c=a/b;
  10. System.out.println("c="+c);
  11. }catch(Exception e) {
  12. System.out.println("出现了除数为0的异常");
  13. //throw e;
  14. }finally {
  15. System.out.println("finally的代码被执行了");
  16. }
  17. }
  18. }
  19.  
  20. 结果:
  21. 出现了除数为0的异常
  22. finally的代码被执行了

finally块的代码在任何情况下都会执行的,除了jvm退出的情况(System.exit)

finally非常适合做资源释放的工作,这样子可以保证资源文件在任何情况下都会被释放。

try块的三种组合方式:

1.比较适用于有异常要处理,但是没有资源要释放的。

    try{

    可能发生异常的代码

    }catch(捕获的异常类型  变量名){

    处理异常的代码

    }

2.比较适用于既有异常要处理,又要释放资源的代码

    try{

    可能发生异常的代码

    }catch(捕获的异常类型  变量名){

    处理异常的代码

    }finally{

    释放资源的代码;

    }

3.比较适用于内部抛出的是运行时异常,并且有资源要被释放。 (合法但不常用)

    try{

    可能发生异常的代码

    }finally{

    释放资源的代码;

    }

包:

包的好处:

  1. 解决类名重复产生冲突的问题
  2. 便于软件版本的发布

定义包的格式:package   包名;

包名命名规范:包名全部小写

包语句要注意的事项:

  1. package语句必须位于java文件中的第一个语句
  2. 如果一个类加上了包语句,那么该类的完整类名就是 : 包名.类名
  3. 一个java文件只能有一个包语句

在dos命令中,  “.“ 表示当前的路径

java  -d   指定类文件的存放路径     java源文件

有了包之后类与类之间的访问:(默认情况是每个类都是一个包)

导包语句作用:简化书写(误区:把一个类导入到内存中)

导包语句的格式:

    import  包名.类名;  (导入xxx包中的某个类)

导包语句要注意的细节:

  1. 一个java文件中可以出现多句导包语句
  2. "*"星号是导包语句的通配符。可以匹配任何的类名   (星号只能用作匹配类名,不能用作匹配包名)
  3. import  包名.*   是不会作用于此包下面的子包的

推荐使用  import  包名.类名    而不要使用  import 包名.*     因为使用*通配符会导致结构不清晰

什么时候使用import语句:

  1. 相互访问的两个类b不是在同一个包下面,这时候就需要使用到导包语句
  2. java.lang包是默认导入的,不需要我们自己导入

权限修饰符:权限修饰符就是控制被修饰的成员的范围可见性。

  public(公共) protected(受保护) default(缺省,也就是没有写东西) private(私有)(大到小)
同一个类 true true true true
同一个包 true true true false
子父类 true true false false
不同包 true false false false

注意:在不同包下面只有public与protected可以访问,而且protected必须是在继承关系下才能够访问。

打jar包:需要使用到jdk的开发工具(jar.exe)

jar的用法:   jar   cvf (-cvf)    jar文件的名字    class文件或者是文件夹

打jar包要注意的事项:

  1. 一个程序打完了jar之后,必须要在清单文件上指定入口类:格式  Main-Class: (注意这里有一个空格)包名.类名
  2. jar包双击运行仅对于图形化界面的程序起作用,对控制台的程序不起作用

jar文件的作用:

  1. 方便用户快速运行一个项目
  2. 提供工具类以jar包的形式给别人使用

如果使用jar包里面的类必须要先设置classpath路径

  1. import javax.swing.*;
  2. public class Test {
  3.  
  4. public static void main(String[] args) {
  5. // TODO Auto-generated method stub
  6. JFrame frame=new JFrame("QQ程序");
  7. frame.setSize(400, 500);
  8. frame.setVisible(true);
  9. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  10. }
  11. }
  12.  
  13. 结果为一个界面

模板模式:

某类事情的步骤有些是固定的,有些是会发生变化的,那么这时候我们可以为这类事情提供一个模板代码,从而提高效率。

模板模式的步骤:

  1. 先写出解决该类事情其中一件的解决方案
  2. 分析代码,把会发生变化的的代码抽取出来独立成一个方法,把该方法也描述成一个抽象的方法
  3. 使用final修饰模板方法,防止别人重写你的模板方法
  1. public class RunTime extends MyRunTime{
  2.  
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. //MyRunTime time=new MyRunTime();
  6. //time.getTime();
  7. RunTime r=new RunTime();
  8. r.getTime();
  9. }
  10. public void code() {
  11. for (int i=0;i<100;i++) {
  12. System.out.println("i="+i);
  13. }
  14. }
  15. }
  16. abstract class MyRunTime{
  17. public MyRunTime() {}
  18. public final void getTime() {
  19. long startTime=System.currentTimeMillis(); //记录开始的时间
  20. code();
  21. long endTime=System.currentTimeMillis(); //记录结束时间
  22. System.out.println("运行时间是:"+(endTime-startTime));
  23. }
  24. public abstract void code();
  25. }
  26.  
  27. 结果:
  28. i=0
  29. i=1
  30. i=2
  31. i=...
  32. i=99
  33. 运行时间是:13

清除重复元素:

例,清除{11,2,4,2,10,11}中的重复元素,并且打印出来,要求不允许又多余的空间

  1. import java.util.*;
  2. public class ClearRepeat {
  3.  
  4. public static void main(String[] args) {
  5. // TODO Auto-generated method stub
  6. int[] arr= {11,2,4,2,10,11};
  7. arr=clearRepeat(arr);
  8. System.out.println("清除重复元素的数组:"+Arrays.toString(arr));
  9. }
  10. public static int[] clearRepeat(int[] arr) {
  11. //先计算出重复元素的格式
  12. int count=0; //记录重复元素的个数
  13. for (int i=0;i<arr.length-1;i++) {
  14. for (int j=i+1;j<arr.length;j++) {
  15. if (arr[i]==arr[j]) {
  16. count++;
  17. break;
  18. }
  19. }
  20. }
  21. System.out.println("重复元素的个数:"+count);
  22.  
  23. //新数组的长度
  24. int newLength=arr.length-count;
  25. //创建一个新的数组
  26. int[] newArr=new int[newLength];
  27. int index=0;//定义一个变量记录新数组使用的索引值
  28. //把旧数组的元素存储到新数组中,存入新数组之前要先判断该元素是否存在新数组中,如果存在了,那么该元素就不要了
  29. for (int i=0;i<arr.length;i++) {
  30. int temp=arr[i]; //取出旧数组的元素
  31. boolean flag=false;//定义一个变量用于记录当前元素是否为重复元素,默认不是重复元素
  32. //检查新数组是否存在取出的元素
  33. for (int j=0;j<newArr.length;j++) {
  34. if (newArr[j]==temp) {
  35. flag=true;
  36. //该元素已经存在了新数组中
  37. break;
  38. }
  39. }
  40. //不是重复元素
  41. if (flag==false) {
  42. newArr[index++]=temp;
  43. }
  44. }
  45. return newArr;
  46. }
  47. }
  48.  
  49. 结果:
  50. 重复元素的个数:2
  51. 清除重复元素的数组:[11, 2, 4, 10]

Java学习笔记(11)的更多相关文章

  1. Java学习笔记11

    package welcome; import java.util.Scanner; /* * 代数问题:求解2x2线性方程 */ public class ComputeLinearEquation ...

  2. Java学习笔记 11/15:一个简单的JAVA例子

    首先来看一个简单的 Java 程序. 来看下面这个程序,试试看是否看得出它是在做哪些事情! 范例:TestJava.java   // TestJava.java,java 的简单范例  public ...

  3. Java 学习笔记(11)——异常处理

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的. 比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error:如果你用System.ou ...

  4. java学习笔记(11) —— Struts2与Spring的整合

    1.右键 项目名称 —— MyEclipse —— Add Spring Capabilities 2.选取 Copy checked Library contents to project fold ...

  5. Java学习笔记11(面向对象四:多态)

    多态: 举例:描述一个事物的多种形态,如Student类继承了Person类,一个Student对象既是Student,又是Person 多态体现为:父类引用变量可以指向子类对象 多态的前提:必须有子 ...

  6. Java学习笔记-11.运行期间类型鉴定

    1.Class对象的getClasses()方法获取的是该类中所有的公共的内部类,以及从父类,父接口继承来的内部类.getinterfaces()方法返回类继承的所有接口. import javax. ...

  7. Java 学习笔记(11)——lambda 表达式

    在写Java代码的时候,如果某个地方需要一个接口的实现类,一般的做法是新定义一个实现类,并重写接口中的方法,在需要使用的时候new一个实现类对象使用,为了一个简单的接口或者说为了一个回调函数就得额外编 ...

  8. Java 学习笔记(11)——多线程

    Java内部提供了针对多线程的支持,线程是CPU执行的最小单位,在多核CPU中使用多线程,能够做到多个任务并行执行,提高效率. 使用多线程的方法 创建Thread类的子类,并重写run方法,在需要启动 ...

  9. Java学习笔记11(this,super)

    this在构造方法间的使用, public class Person { private String name; private int age; public Person() { //this( ...

  10. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

随机推荐

  1. MFC单文档框架分析及执行流程(转)

    原文转自 https://blog.csdn.net/u011619422/article/details/40402705 首先来分析一下MFC单文档类的结构: 它包括如下几个类: CAboutDl ...

  2. JS中Unix时间戳转换日期格式

    <!doctype html> <html> <head> <title>Unix时间戳转换成日期格式</title> <script ...

  3. Oracle 获取ddl语句

    --得到所有表空间的ddl语句 SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name)FROM DBA_TABLESPACES T ...

  4. mybatis源码阅读(动态代理)

    这一篇文章主要是记录Mybatis的动态代理学习成果,如果对源码感兴趣,可以看一下上篇文章  https://www.cnblogs.com/ChoviWu/p/10118051.html 阅读本篇的 ...

  5. JDBC数据源连接池(3)---Tomcat集成DBCP

    此文续<JDBC数据源连接池(2)---C3P0>. Apache Tomcat作为一款JavaWeb服务器,内置了DBCP数据源连接池.在使用中,只要进行相应配置即可. 首先,确保Web ...

  6. winscp上传出现时间戳提示错误

    文件ngx_http_access_module.c上传成功,但是在设置权限和/或时间戳时发生错误.具体内容上图:         我们可以选择 ‘中止’,文件是可以上传成功的,就是每次都会提示这个信 ...

  7. 调用微信JS-SDK接口上传图片

    最近要在微信上做个问卷调查,有个上传图片功能,折腾找了半天资料,都不好弄,最终打算调用微信提供的上传图片接口,实现上传图片功能!此功能最大的好处是可以在微信服务器上暂存图片,减少本地服务器图片的缓存, ...

  8. java的关键字final

    final可以修饰类,成员方法,成员变量. 1.final修饰的类不能被继承,所以没有子类 final class First{ int num; } class Second extends Fir ...

  9. Developer Express控件gridcontrol中gridView的某一个单元格是否可以自由输入

    场景:在Developer Express控件gridcontrol中的gridView中,当医生开的临时医嘱的医嘱类型为"中草药","计价总量"单元格不可以自 ...

  10. Monty Hall悖论

    Monty Hall悖论又称为蒙提·霍尔悖论.三门问题.Monty Hall是上个世纪60年代,电视游戏节目“Let's Make a Deal”的主持人,这个悖论便是以他的名字来命名的.节目的规则是 ...