zoukankan      html  css  js  c++  java
  • java方法的理解、调用栈与异常处理

    一、流程分支

       If/else :基于boolean值的双分支

       Switch:基于数字(整数、charbyte、枚举)、字符串

         类型的多分支

    Int month =5;

    Switch

    二、方法method

    1.方法就是一个子程序

    Java中方法的命名规范是驼峰命名法。

       int add( int a, int b ){

          int result = a + b;

          return result;

    }

     float add( float a, float b){

          

          float result = a + b;

          return result;

    }

    2.方法也是有类型的

       对于方法的使用者来说,返回值就是方法的类型

       对于重载来说,方法签名就是其类型

           方法签名:方法的名字+参数类型(多个,顺序严格的)

       方法的返回值类型不属于签名的一部分

    //这两个方法的方法签名相同,因此传的参数不知道调用哪一个方法,无法确定返回类型。

     int add( int a, int b ){

          int result = a + b;

          return result;

    }

       float add( int a, int b ){

          int result = a + b;

          return result;

    }

       签名不同才能重载!!

     

    Tips

    1>对于java8中的拉姆达表达式来说,方法的类型包括

    返回值类型->(参数类型<多个,顺序严格的>

     

    2>方法的返回值有一个特殊的类型void,、

    没有返回值,也就是方法中没有return语句

     

    3>方法的参数传递时有2种传值形式,实际是由参数的类型的性质决定的。

     

           基本类型:按值传递,把值复制到方法中

           引用类型:只是传递对象的引用,如果在方法中改变了对象(内部属性),就会影响这个对象

     

    4>方法(包括面向对象)都不是必须的!方法和面向对象都是给程序设计人员使用的。所以写代码时,如果要定义方法,就是站在设计师的高度去完成方法的设计。

     

    3.设计的必要性:

    设计师有必要的(有利于提升质量、可维护性、效率、重用),但是设计是无止境的,适可而止。评价设计优劣的标准:简化、不用重复(消除重复代码)

     

    4.提取方法,将功能只能分散

    如果一个方法代码太多,指责太多,则表示需要对这个方法进行重构(Rafactor)。通常会使用提取方法的功能智能进行分散

    IDEEcllipse)对此提供非常好的支持

    举例:单位转换程序,所以的代码都可以写在main方法中。但是将调度职责和具体的转换职责进行拆分,将会使程序结构更加清晰。整个程序也会更加简单。

     

    public Class UnitClac{

          

        //交互逻辑

          static void main(String[] args){

            //进行转换调度

    }

     

           //业务逻辑

    static void c2f(Scannerscanner){

      //将摄氏度转换为华氏度

    }

     

    static void f2c(Scannerscanner){

      //将华氏度转换为摄氏度

    }

    }

    任何应用都由应用交互逻辑和业务逻辑2部分构成

          交互逻辑可以随意改变,而且经常会随技术和流行趋势变化。

          业务逻辑相对稳定。

          交互逻辑通常围绕UI展开。

          业务员逻辑通常围绕数据展开

                 具体来说就是收集数据、存储、分析、展示数据

     

    Static (静态的)方法没有充分体现面向对象的特征。

    对于static方法来说,类只是一个盒子(容器),static方法与对象(实例)关系不大。

    三、程序调试

       通过调试可以观察程序的执行过程和内部数据

       调试是一个非常强大的能力(断点和单步执行是由CPUJVM联合支持的)

    通过“虫子”图标可以进入调试模式,如果没有看到调试视图,可以在右上角进行透视图的切换

        加断点:让程序停留在断点的位置

        单步执行:F5/F6

    F5:进入方法

    F6:越过方法

    四、调用栈

        先入后出

    栈是一个只有一个口的容器,先进入栈的会落到栈底,出栈的时候最后出。最后进入栈的,在栈顶,出栈时先出。

    方法调用时,需要在内存中开辟一块存储空间做为线程栈空间

     每个线程都由自己的栈

    调用方法时,会在栈中压入一个栈帧,用来存储这个方法的参数和局部变量

    方法返回时 ,栈帧就会弹出,方法的参数和局部变量就会清除

    方法调用时,调用栈不断处于涨落之中

    如果调用的层级过深,调用栈可能会溢出

    因为代码执行的速度很快,所以栈帧的生存时间很短,瞬间生灭

      所以局部变量无法被外部使用

    五、异常处理

    程序执行时,遇到错误(调用栈中的错误)就会停止执行,如果错误数据不能清除掉,程序就无法恢复,最终崩溃。

    而java等现代编程语言普遍提高了清理错误数据的机制

    异常处理

    早期的c语言没有异常处理机制

    java中,有一类异常很特别,它们叫做受查异常

          受查异常必须传递出去(thows)或者处理掉(try/catch),不能不管

    try(){

      

    }

    当代码执行到try时,会建立一个安全点,一旦在try中发生错误

    JVM就会检查并收集错误信息(错误的原因、错误的位置、当前调用栈的结构等)

    然后利用这些信息创建一个Exception对象(类型取决于错误原因)

    然后抛出(throw)这个异常对象

    异常对象的传播当异常被抛出throw之后,JVM会沿着调用栈从上往下逐帧查找try建立的安全点,直到找到一个符合条件的catch或者到达栈底(崩溃)

    Catch SomeTypeException ex{

         //清理

         //异常对象的使用

    }

    //从这里继续执行

    异常的catch

    Catch是一个匹配的过程,只有类型匹配成功,才会接受(捕获),否则继续沿着调用栈查找。      

       当异常被处理后,上面的栈帧就会被清除

    如果在错误之前打开了一个系统资源,则该资源就有可能没有正确地关闭,所有try catch后面可以写finally{   }

       finally一定会被调用,可以用来关闭资源。

    异常对象中包含的信息可以通过异常对象提供的方法获取到

         getMessage()

         getStackTrace()

         printStackTracd() 可以把异常信息打印到控制台或指定的输出流中(保存成文件等)

    作业:

    1.画一个调用栈来表示多层方法调用的过程

     

    static   void main(){

         double a = 3;

         double b =5;

      

         double c  = calcArc(3,5)

     

    }

    static double calcArc(double x, double y){

    double m = pow(x);-+

    double n = pow(y);

    double 0 = m+n;

    return sqrt(o);

    }

    2.Squarea边长

          Rectangle类    ab长宽

          Circle  类     r半径

          Sidelength()周长

    3.画一个异常传播的示意图

  • 相关阅读:
    【cf932E】E. Team Work(第二类斯特林数)
    【bzoj5093】[Lydsy1711月赛]图的价值(NTT+第二类斯特林数)
    斯特林数及斯特林反演
    Codeforces Round #608 (Div. 2)
    【cf1272】F. Two Bracket Sequences
    Codeforces Round #606 (Div. 2)
    【hdu4045】Machine scheduling(dp+第二类斯特林数)
    【poj2661】Factstone Benchmark(斯特林公式)
    [USACO1.4] Packing Rectangles
    [CF1313D] Happy New Year
  • 原文地址:https://www.cnblogs.com/yangxiansen/p/7860058.html
Copyright © 2011-2022 走看看