精华内容
下载资源
问答
  • 今天小编就大家分享一篇关于Java中关于子类覆盖父类的抛出异常问题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • gradle不同版本打的jar对比,未将throw Exception打进jar中,1.5.0版本泛型也没打到jar中

    前言

    本地开发的时候运行正常,开启了混淆之后编译通过运行失败

    描述

    项目中遇到了一个问题,module中有一个方法,改方法会抛Exception,

        public Map<String, String> encryptParams(Map<String, String> params) throws Exception {
            return params;
        }

    在主工程中有一个改类的子类复写类该方法,做了一些其他的逻辑,开发的时候为类方便把混淆关了直接关联工程开发。调试完毕之后开了混淆准备打包然后就build 失败。

    0001

    根据提示判断是因为父类中的encryptParams()方法未抛Exception,所以子类也不能抛。看代码确定是有throw Exception的,于是Module打出来的jar反编译下看看到底有没有。

    JD-GUI可以很方便的反编译jar包。使用AndroidStudio更方便直接把jar拖到libs下面,然后sync。

    这里写图片描述

    可以看到混淆后的代码

    0003

    来一张对比的

    0004

    对比发现混淆后的jar是没有throw Exception的,这里的gradle版本是1.5.0,仔细观察发现map的泛型也没有。

    再来一张gradle 2.3.3 版本的(因为我Studio版本是2.3.3的),有泛型没有throw Exception

    0005

    最后放上三个对比的

    //    混淆后 gradle 1.5.0
    //    public Map encryptParams(Map var1) {
    //        return var1;
    //    }
    
    //    混淆后 gradle 2.3.3
    //    public Map<String, String> encryptParams(Map<String, String> var1) {
    //        return var1;
    //    }
    
        //混淆前
        public Map<String, String> encryptParams(Map<String, String> params) throws Exception {
            return params;
        }

    Demo地址

    结论

    gradle 1.5.0版本 在开启混淆生成jar的时候会把泛型和throw Exception去掉,gradle 2.3.3版本开启有泛型无throw Exception。原因暂未查到,有清楚的欢迎讨论。

    补充

    后期发现泛型是因为没有在混淆配置中添加忽略,添加以下内容就可以保留混淆。

    # 避免混淆泛型
    -keepattributes Signature

    最终解决方案

    今天突然想起来,EventBus在注册了两次之后会抛异常,就去看下EventBus怎么处理的。直接看代码

        // Must be called in synchronized block
        private void subscribe(Object subscriber, SubscriberMethod subscriberMethod) {
           ...
            if (subscriptions == null) {
                subscriptions = new CopyOnWriteArrayList<>();
                subscriptionsByEventType.put(eventType, subscriptions);
            } else {
                if (subscriptions.contains(newSubscription)) {
                    throw new EventBusException("Subscriber " + subscriber.getClass() + " already registered to event "
                            + eventType);
                }
            }
            ...

    抛了异常但方法上没有throws ,跟进去EventBusException

    public class EventBusException extends RuntimeException { ... }

    原来如此。
    方法来了,只需要把我们之前的Exception 换成 RuntimeException或者自定义一个他的子类就可以解决库中抛的异常不会打进jar中的问题了,然后在需要的地方处理catch到的异常。
    Exception:在程序中必须使用try…catch进行处理。
    RuntimeException:可以不使用try…catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。
    所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try…catch的异常处理机制进行处理。

    展开全文
  • * Exception是所有异常类的父类 * 如果将它的代码块方其他两个代码块前面,后面的代码块将永远得不到执行 * 所以 catch 语句的顺序不可调换 * * 异常的使用原则: * 1.在当前...
    package com.exception.demo;
    
    public class Captor {
    
    	/**
    	 * @param args
    	 * Exception是所有异常类的父类
    	 * 如果将它的代码块方其他两个代码块前面,后面的代码块将永远得不到执行
    	 * 所以 catch 语句的顺序不可调换
    	 * 
    	 * 异常的使用原则:
    	 *    1.在当前方法中使用 try - catch 语句捕获异常
    	 *    2.一个方法被覆盖时,覆盖它的方法必须抛出相同的异常或异常的子类
    	 *    3.如果父类抛出多个异常,则覆盖方法必须抛出那些异常的一个子集,不能抛出新异常 
    	 */
    	static int quotient(int x,int y)throws MyException{	// 定义方法抛出异常
    		if(y < 0){	// 判断参数是否小于0
    			throw new MyException("除数不能是负数");	// 异常信息
    		}
    		return x / y;	//  返回值
    	}
    	
    	
    	public static void main(String[] args) {	// 主方法
    		try {	// try语句包含可能发生异常的语句
    			int result = quotient(3, -1);	// 调用语句方法 quotient()
    		} catch (MyException e) {	// 处理自定义异常
    			System.out.println(e.getMessage());	//输出异常信息
    		}catch (ArrayStoreException e) {	// 处理 ArrayStoreException 异常
    			System.out.println("除数不能为0");	// 输出异常信息
    		}catch (Exception e) {	// 处理其它异常
    			System.out.println("程序发生了其他异常");	//输出提示信息
    		}
    	}
    
    }
    
    class MyException extends Exception {	// 创建自定义异常类
    	String message;	// 定义 String 类型变量
    	
    	public  MyException(String ErrorMessager){	// 父类方法
    		message = ErrorMessager;
    	}
    	
    	public String getMessage(){	// 覆盖 getMessage() 方法
    		return message;
    	}
    
    }
    

      

    转载于:https://www.cnblogs.com/spadd/p/4174605.html

    展开全文
  • Python 抛出异常

    万次阅读 2017-12-13 23:20:41
    如果没有 try 和 except 语句覆盖抛出异常的 raise 语句,该程序就会崩溃,并显示异常的出错信息。通常是调用该函数的代码知道如何处理异常,而不是该函数本身。所以你常常会看到 raise 语句在一个函数中, try 和 ...

    Python 抛出异常

    抛出异常相当于是停止运行这个函数中的代码,将程序执行转到 except 语句。

    如果没有 try 和 except 语句覆盖抛出异常的 raise 语句,该程序就会崩溃,并显示异常的出错信息。通常是调用该函数的代码知道如何处理异常,而不是该函数本身。所以你常常会看到 raise 语句在一个函数中, try 和 except 语句在调用该函数的代码中。

    使用 try 和 except 语句,你可以更优雅地处理错误,而不是让整个程序崩溃。

    #!/usr/bin/env python3
    # -*- coding:utf-8 -*-
    
    def boxPrint(symbol, width, height):
        if len(symbol) != 1:
            raise Exception("Symbol must be a single character string.")
        if width <= 2:
            raise Exception("Width must be greater than 2.")
        if height <= 2:
            raise Exception("Height must be greater than 2.")
    
        print(symbol * width)
        for i in range(height - 2):
            print(symbol + (' ' * (width - 2)) + symbol)
        print(symbol * width)
    
    
    for sym, w, h in (('*', 4, 4), ('O', 20, 5), ('x', 1, 3), ('ZZ', 3, 3)):
        try:
            boxPrint(sym, w, h)
        except Exception as err:
            print('An exception happened: ' + str(err))
    

     

    /usr/bin/python3.5 /home/strong/workspace/master.py
    ****
    *  *
    *  *
    ****
    OOOOOOOOOOOOOOOOOOOO
    O                  O
    O                  O
    O                  O
    OOOOOOOOOOOOOOOOOOOO
    An exception happened: Width must be greater than 2.
    An exception happened: Symbol must be a single character string.
    
    Process finished with exit code 0
    

     

    展开全文
  • 这是一篇有关JAVA:内层方法抛出异常,外层方法捕捉并处理异常的文章信息。 我发布到报名在线EDU84.COM上,和大家分享一下JAVA:内层方法抛出异常,外层方法捕捉并处理异常 public void methodA (){  try{  // ...

    这是一篇有关JAVA:内层方法抛出异常,外层方法捕捉并处理异常的文章信息。
    我发布到报名在线EDU84.COM上,和大家分享一下JAVA:内层方法抛出异常,外层方法捕捉并处理异常
    public void methodA (){ 
    try{ 
    // 调用methodB 
    methodB(); 

    catch(ExceptionType et){ 
    // 相应处理措施 


    public void methodB throws ExceptionType{ 
    if (condition is true) 

    // 相应处理措施 

    else 

    throw new ExceptionType(argument); 


    在这个例子中,方法B的头部中声明了该方法会抛出一个类型为ExceptionType的异常,在方法体中使用throw子句抛出了一个异常,那么该异常被谁捕捉到呢,答案是方法A。因为异常抛出后,JVM会顺着该方法的调用栈一层一层的往上找。因为方法A中有一个catch(ExceptionType et),所以被抛出的异常会被捕捉到并处理。

    展开全文
  • 异常在子父类覆盖(方法重写)中的体现1、子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常 或 其子类异常2、如果父类方法 抛出 多个异常,那么子类在覆盖方法时,只能抛出 父类...
  • Java的声明抛出异常

    千次阅读 2018-07-29 17:26:11
    如果一个方法(中的语句执行时)可能生成某种异常,但是并不能确定如何处理这种异常,则此方法应显示地声明抛出异常,表明该方法将不对这些异常进行处理,而由该方法的调用者负责处理。 在方法声明中用throws语句可以...
  • Java 中的异常处理除了包括捕获异常和处理异常之外,还包括声明异常和拋出异常,可以通过 throws 关键字在方法上声明该方法要拋出的异常,然后在方法内部通过 throw 拋出异常对象。本节详细介绍在 Java 中如何声明...
  • python抛出异常

    千次阅读 2018-08-23 09:31:03
    当 Python 试图执行无效代码时,就会抛出异常。在第 3 章中,你已看到如何使用 try 和 except 语句来处理 Python 的异常,这样程序就可以从你预期的异常中恢复。但你也可以在代码中抛出自己的异常。抛出异常相当于是...
  • 【0】README0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常——捕获异常+再次抛出异常与异常链 的相关知识;【1】捕获异常相关1.1)如果某个异常发生的时候没有再任何地方进行捕获, 那程序...
  • 使用throw抛出异常

    万次阅读 多人点赞 2018-04-14 17:48:45
    使用throw抛出异常throw总是出现在函数体中,用来抛出一个Throwable类型的异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配...
  • 例一,当类B继承类A时: class A{  public void show() throws FileNotFoundException{ ... 某个类实现了一个接口或继承了一个类,当该类进行方法覆盖时,抛出异常只能是原方法异常或者是原方法异常的子集。
  • 【0】README0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常——异常分类+声明已检查异常+如何抛出异常+自定义异常类 的相关知识; 0.2)异常处理的任务: 就是将控制权从错误产生的地方转移...
  • 常,因此在运行时期也就出现失败 总结:这个示例也就演示了一个道理,在java中,子类重写父类的方法时,子类如果选择抛出异常,那么抛出的异常类型不能大于父类的异常类型 西城风雨楼 原创文章 6获赞 22访问量 1万+ ...
  • 子类抛出的异常类型不能比父类抛出的异常类型更宽泛!...2.抛出的异常是父类抛出异常的子类,如EOFException异常 3.不抛出异常。 4.java.lang.RuntimeException异常或者其子孙类异常 在catch子句中心抛出一个比父类型
  • Java中父类和子类抛出异常的处理

    千次阅读 2018-12-20 08:05:00
     这篇博客的灵感来自于我在实际工作中,发现 Runnable接口的run方法不可以在方法抛出异常,如果有编译时异常,那么只能在方法内部进行 try-catch ,这个知识点成功引起了我的注意。于是,这...
  • throws和throw关键字抛出异常描述

    千次阅读 2019-07-07 15:33:15
    使用throws关键字抛出异常 Throws 关键字通常用来声明方法时,用来指定方法可能抛出的异常。多个异常可以使用逗号分隔。 创建类ThrowsDemo类,在该类中创建方法pop(),该方法中抛出NegativeArraySizeException...
  • java throw抛出异常

    千次阅读 2014-11-20 14:15:20
    1、throws关键字通常应用在声明方法时,用来指定可能抛出异常。多个异常可以使用逗号隔开。当在主函数中调用该方法时,如果发生异常,就会将异常抛给指定异常对象。如下面例子所示: public class Shoot { 创建...
  • // 此程序依据的原理是子类对象即是父类对象 class EatException extends Exception { } class Father {  public void eat() throws EatException {  System.out.println("father eat");...
  • 使用throw关键字抛出异常

    千次阅读 2011-12-03 18:43:01
    通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常方法中使用throws关键字在方法的声明中指明要抛出的异常;如果要捕捉throw抛出的异常,则必须使用try-catch语句。 throw通常用来抛...
  • python mock 打桩抛出异常

    千次阅读 2018-08-20 10:36:01
    但是有一个问题就是,python代码本来就很短,一个函数可能就几行,而且工程代码为了方便定位错误,会在函数的前后包围try_except_else块,这一个块就占了几行,如果没一个函数都无法覆盖这个异常处理的块,那么覆盖...
  • throw,throws和层层抛出异常

    千次阅读 2016-07-13 20:42:58
    throw和throws2016-07-13throw –关键字throw用于显式抛出异常。 –抛出异常后处理: .使用try-catch捕获异常。 .使用throws声明异常。 –语法 .throw new 异常类构造方法 .例如: throw new
  • Qt 抛出异常的容器

    千次阅读 2018-01-27 20:34:10
    QList的at当超出范围时,不抛出异常,而是程序直接崩溃。是因为QList的at函数如下template inline const T &QList::at(int i) const { Q_ASSERT_X(i >= 0 && i ::at", "index out of range"); return reinterpret_...
  • Java异常抛出时的规定

    2013-03-07 17:08:38
     1,子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类.  2,如果父类方法抛出多个异常,那么子类在覆盖方法时,只能抛出父类异常的子集.  3,如果父类或者接口的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 149,847
精华内容 59,938
关键字:

被覆盖的方法为抛出异常