java try catch 之后定位不到具体报错行_JAVA入门(三)上

点击蓝字|关注我们

一、异常与异常处理

异常简介

代码中:阻止当前方法或作用域继续实现的,称之为异常
java中的所有异常类都继承Throwable类,
Exception 的父类是 Throwable

编码 环境 用户操作输入出现问题由java虚拟机自动抛出和自动捕获需要手动添加抛出和捕获语句文件找不到ThrowableErrorException虚拟机错误 VirtualMachineError线程死锁 ThreadDeath非检查异常 RuntimeException检查异常空指针异常 NullPointerException数组下标越界异常 ArrayIndexOutOfBoundsException类型转换异常 ClassCastException算数异常 ArithmeticException......文件异常 IOExceptionSQL异常 SQLException......

RuntimeException运行时异常会由java虚拟机自动抛出和自动捕获,运行时异常的出现绝大部分因为代码的问题,应该从逻辑上改进代码

处理异常

使用try-catch 和try-catch-finally

try{
        //一些会抛出异常的方法}catch(Exception e){
        //处理该异常的代码块    //根据不同的异常情况做出不同的处理方式}

如果try中的方法抛出异常,首先会终止执行,然后程序的控制权将被移交给catch块中的异常处理程序catch中的处理方式,如:

  1. 提示警告用户或编程人员检查配置或网络连接等

  2. 进行错误日志的记录等


import java.util.InputMismatchException;import java.util.Scanner;public class Demo02 {
            public static void main(String[] args) {
                    try {
                            System.out.println("请输入你的年龄:");                        Scanner input = new Scanner(System.in);                        int age = input.nextInt();                        System.out.println("十年后你"+(age + 10)+"岁");                }catch(InputMismatchException e) {
                            System.out.println("你应该输入整数");                }                System.out.println("程序结束啦!");        }        }

如果try中的代码块会抛出很多种类型的异常呢?针对不同的异常需要进行不同的处理,在try后边添加多个catch如:


import java.util.InputMismatchException;import java.util.Scanner;public class Demo02 {
            public static void main(String[] args) {
                    Scanner input = new Scanner(System.in);                try {
                            System.out.println("请输入第一个数:");                        int one = input.nextInt();                        System.out.println("请输入第二个数:");                        int two = input.nextInt();                        System.out.println("两数相除结果为:"+ one / two);                }catch(InputMismatchException e) {
                            System.out.println("你应该输入整数");                }catch (ArithmeticException e) {
                            System.out.println("除数不能为0");                }catch (Exception e) {
                            System.out.println("我是不知名异常");                }                System.out.println("程序结束啦!");        }        }

catch的异常从上往下应该从小到大,从子类到父类,针对于父类的异常处理程序,对于子类也是适用的。Exception 为InputMismatchException和ArithmeticException的父类,因此放到最后边如果顺序写错了,编译会报错。


public class TryCatchTest {
            public static void main(String[] args) {
                    TryCatchTest q = new TryCatchTest();                int result = q.test();                System.out.println("test方法执行完毕,返回值为:"+ result);        }                /**         * divider(除数)         * result(结果)         * try-catch捕获while循环         * 每次循环,divider-1,result=result+100/divider         * 如果:捕获异常,打印输出“抛出异常了!!!”,返回-1         * 否则:返回result         * finally:打印输出:这是finally         * @return         */        public int test() {
                    int divider = 10;                int result = 100;                try {
                            while(divider > -1) {
                                    divider--;                                result += 100/divider;                        }                        return result;                                        }catch(Exception e) {
                            e.printStackTrace();//打印异常信息                        System.out.println("抛出异常了!!!");                        return -1;                }finally {
                            System.out.println("这是finally!!!");                }                        }        }/*打印结果:java.lang.ArithmeticException: / by zero抛出异常了!!!这是finally!!!      at com.imooc.test.TryCatchTest.test(TryCatchTest.java:26)      at com.imooc.test.TryCatchTest.main(TryCatchTest.java:6)test方法执行完毕,返回值为:-1*/
java中的异常抛出以及自定义异常

throw ---- 将产生的异常抛出(动作)
throws ----声明将要抛出任何类型的异常(声明)
public void 方法名(参数列表)
throws 异常列表{
//调用会抛出异常的方法或者:
throw new Exception();
}

//异常抛出        public void divide(int one, int two) throws Exception{
                    if(two == 0) {
                            throw new Exception("两数相除,除数不能为0!!");                }else {
                            System.out.println("两数相除,结果为:" + one / two);                }                        }

自定义异常

class 自定义异常类 extends 异常类型{}自定义异常类必须继承相近含义的java的异常类,或直接继承Exception类


public class DrunkException extends Exception{
            public DrunkException() {
                            }                public DrunkException(String message) {
                    super(message);        }}

java中的异常链

捕获到的异常,可以在当前方法的 catch 块中处理,也可抛出给调用者去处理


public class ChianTest {
            /**         * test1();抛出“喝大了”异常         * test2();调用test1(),捕获“喝大了”异常,并且包装成运行时异常,继续抛出         * main()中调用test2(),尝试捕获test2()方法抛出的异常         * @param args         */        public static void main(String[] args) {
                    // TODO Auto-generated method stub                ChianTest ct = new ChianTest();                try {
                            ct.test2();                }catch(Exception e){
                            e.printStackTrace();                }        }        public void test1() throws DrunkException{
                    throw new DrunkException("喝车别开酒");        }        public void test2() {
                    try {
                            test1();                } catch (DrunkException e) {
                            // TODO Auto-generated catch block                        RuntimeException newExc = new RuntimeException("司机一滴酒,亲人两行泪");                        newExc.initCause(e);                        throw newExc;                        //                   或者//                   RuntimeException newExc = new RuntimeException(e);//                   throw newExc;                }        }}
异常处理经验总结
  1. 处理运行时异常,采用逻辑去合理规避同时辅助try-catch处理

  2. 在多重catch块后边,可以加一个catch(Exception)来处理可能会被遗漏的异常

  3. 对于不确定的代码,也可以加上try-catch,处理潜在的异常

  4. 尽量去处理异常,切忌知识简单的调用printStackTrace()去打印输出

  5. 具体如何处理异常,要根据不同的业务需求和异常类型去决定

  6. 尽量添加finally语句块去释放占用的资源

二、Java中的字符串

字符串被作为String类型的对象处理,String类位于java.lang包中。默认情况下,该包会被自动导入到所有的程序中。

字符串的不变性

String对象创建后则不能被修改,是不可变的,所谓的修改其实是创建了新的对象,所指向的内存空间不同。


public class Demo02 {
            public static void main(String[] args) {
                    String s1 = "imooc";                String s2 = "imooc";                String s3 = new String("imooc");                String s4 = new String("imooc");                System.out.println(s1 == s2);//true,多次出现的字符产量,java编译程序只创建一个,因此为true                System.out.println(s1 == s3);//false,s1和s3是不同对象,因此为false                System.out.println(s3 == s4);//false,s3和s4是不同对象,因此为false                s1 = "welcome to "+s1;                System.out.println(s1);//字符串s1被修改,指向新的内存空间        }        }

b268857d4f39c209cbc0b3d2b26f3fc0.png407df1737c8fb04b4b57a5e35f35ab4c.png

一旦一个字符串在内存中创建,则这个字符串将不可改变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值