android 拋出java.lang.VerifyError: Rejecting class xxxxxx java.lang.VerifyError: Rejecting class


  之前團隊開發的android項目主要運行在android4.4的版本上,最近開發的一個新的項目的運行的os是android 5.1,當大家在開發完成之后,不管是在真機還是模擬器上運行,都會有如題描述的問題,經過認真比對之后,發現只要是運行在android5.0以上的環境下,就有異常,在5.0以下的設備中,安然無恙。下面詳細記錄處理過程:

  1.通過設備的報錯信息,可以看出這是一個運行時錯誤,在編譯時是沒有問題的,而且與設備的os版本有關系,想到android在5.0之后更換了java虛擬機,可能跟這個有關系,於是google了一番,得到的答案基本類似如下,在仔細檢查了我們的代碼之后,並沒有這種問題,還得換種思路繼續排查

 

  2.在進一步的調試過程中,發現只要涉及到報錯的這個類的任何操作都會拋出這個異常,包括調用構造方法和靜態方法,說明是編譯和運行時獲得類的信息不一致,一下子想到了多態,在進一步分析代碼的過程中發現了代碼中有類似的實現,放出部分代碼:

IPay.java

/**
 * 
 * @author polymax
 * pay的接口
 *
 */
public interface IPay {
  public float getPayed();
}

 Pay.java

/**
 * 
 * @author polymax
 * Pay的具體實現
 *
 */
public class Pay implements IPay{
  private float payedMoney;
  private float totalNeedPay;
  @Override
  public float getPayed(){
    return payedMoney;
  }
  
  public float getTotalNeedMoney() {
    return totalNeedPay;
  }
}

Order.java

/**
 * 
 * @author polymax
 * 定義Order的接口
 */
public interface Order {
  public IPay getPayInfo();
}

OderImpl.java

/**
 * 
 * @author polymax
 * Order的具體實現
 *
 */
public class OrderImpl implements Order {

  /**
   * 注意這里的返回值是Pay,不是Order接口中定義的IPay
   */
  @Override
  public Pay getPayInfo() {
    return null;
  }

}

在Order這個接口中定義的getPayInfo返回的是IPay這個接口,而在具體實現的時候,返回的是Pay,按照正常邏輯去理解,沒有什么問題,事實上編譯器也是這么理解的,但是問題就出在運行時,當我們修改了Order類getPayInfo的返回值為Pay之后,就解決了問題。

 

  具體原因可能跟新的虛擬機有關系,這個解決問題的過程可能有些巧合,以后如果有空再去深究這個問題,先在這remark下,鄙人本身也不是做android的,如果有人路過看到,又恰好有知曉原因,歡迎留言告知,thx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM