2017-05-04 36 views
11

當我使用lambda來遍歷字符串數組時,我得到了跟隨錯誤。NoClassDefFoundError當我使用lambda來遍歷字符串數組

java.lang.NoClassDefFoundError: com.twsz.app.ivybox.alarm.CreateOrUpdateAlarmActivity$$Lambda$1 
at com.twsz.app.ivybox.alarm.CreateOrUpdateAlarmActivity.initView(CreateOrUpdateAlarmActivity.java:143) 
at com.twsz.app.ivybox.alarm.CreateOrUpdateAlarmActivity.onCreate(CreateOrUpdateAlarmActivity.java:73) 

這是我的code.I知道傳統的方式來遍歷字符串數組是可以的,但爲什麼當我使用lambda時會發生這種情況。

String[] days = dayOfWeek.split(","); 
    Arrays.asList(days).forEach(day->{ 
     int index = Integer.valueOf(day) -1; 
     checkBoxList.get(index).setChecked(true); 
    });//where happens NoClassDefFoundError 

我的build.gradle文件

android { 
     compileSdkVersion 25 
     buildToolsVersion "25.0.2" 
     defaultConfig { 
      applicationId "com.twsz.app.ivybox" 
      minSdkVersion 14 
      targetSdkVersion 25 
      versionCode 1 
      versionName "1.0" 
      testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
      vectorDrawables.useSupportLibrary = true 
     } 

     compileOptions { 
      sourceCompatibility JavaVersion.VERSION_1_8 
      targetCompatibility JavaVersion.VERSION_1_8 
     } 

     dataBinding { 
      enabled = true 
     } 
    } 

感謝您的幫助。

+1

@SachinGupta String like「1,2,3,4,5,6,7」 – Cyrus

+3

檢查此問題http://stackoverflow.com/questions/34162074/transforming-lambdas-in-java-8 –

+1

lamda require java8或更新。據我所知android還不支持java8。 – k3b

回答

8
 * 
    * @param action The action to be performed for each element 
    * @throws NullPointerException if the specified action is null 
    * @since 1.8 
    */ 
    default void forEach(Consumer<? super T> action) { 
     Objects.requireNonNull(action); 
     for (T t : this) { 
      action.accept(t); 
     } 
    } 

的forEach是默認方法,它只能通過java8支持。

Android不支持所有Java 8語言功能。

默認和靜態接口方法
Lambda表達式(也API級別23可用,下)
重複標註 方法引用(:然而,開發應用定位的Android 7.0(API級別24)時,可以使用以下功能也可在API級別23和下部)
類型的註釋(也可在API級別23,下)

支持Android默認和靜態接口中的方法,但它需要API級別24.More詳情here

defaultConfig { 
      applicationId "com.twsz.app.ivybox" 
      minSdkVersion 14 // Your minSdkVersion is less than 24 
      targetSdkVersion 25 
      versionCode 1 
      versionName "1.0" 
      testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
      vectorDrawables.useSupportLibrary = true 
     } 

當您在系統中運行應用程序少於24時,您將得到該異常。所以你最好換另一種方式。傳統的循環或Rxjava2。

3

使用Java 8個功能,則需要啓用傑克工具鏈

defaultConfig { 
    ... 
    jackOptions { 
     enabled true 
    } 
    } 

有關更多信息,請參見documentation

+0

它不起作用。我記得Databinding不能和Jack編譯器一起工作,但是這個bug似乎是固定的。 – Cyrus

+0

你能指定什麼不起作用嗎?對於lambda,你需要Jack,並且如果DataBinding不能與Jack一起工作,那麼你只能使用Java 7 ... – Sarvex

+0

我將jackOptions添加到我的build.gradle文件中,但運行java.lang.NoClassDefFoundError時出現同樣的錯誤我的應用程序 – Cyrus

9

forEach方法僅適用於Android N,您不能在SDK 24之前使用Java 8以前的任何API。

即使您使用的是Retrolambda或Jack。

您需要使用常規循環。

6

根據Android的說法,如果你想使用lambdas,你需要將你的targe API設置爲低於23(你的當前設置爲25),然後使用Jacktool鏈。

docs

Android不支持所有Java 8語言特性。

  • 默認和靜態接口方法
  • Lambda表達式(還API級23可用和下部)
  • :然而,開發應用定位 的Android 7.0(API級24)當 下列功能是可用重複標註
  • 方法引用(也API級別23可用,下)
  • 類型的註釋(也API級別23可用,下)

注意:注意:類型註釋信息在編譯時可用, 但在運行時不可用。此外,該平臺支持TYPE在API 24及以下 ,但不ElementType.TYPE_USE或ElementType.TYPE_PARAMETER ..

爲了測試lambda表達式,方法引用,並 早期版本的Android的類型標註,去你的build.gradle文件,並將 compileSdkVersion和targetSdkVersion設置爲23或更低。您仍然需要啓用Jack工具鏈來使用這些Java 8功能。