2011-05-17 74 views
0

我正在构建一个Android应用程序,使用一堆switch语句在视图之间切换。一切都很顺利,直到我添加了一些案例,导致应用程序启动时发生致命错误。这些案例由XML中的onClick语句调用。有争议的案例块实际上是可以正常工作的一组语句的一部分。任何人都可以看到我失踪的东西吗?什么导致致命的错误?我包含了破碎的代码和工作代码以及logCat文件的片段。该XML的Switch case语句在我的Android应用程序中导致致命错误

05-17 01:48:01.931: INFO/System.out(270): debugger has settled (1381) 
05-17 01:48:02.341: WARN/dalvikvm(270): VFY: invalid switch target 7170 (-> 0x1c0b) at 0x9[0] 
05-17 01:48:02.351: WARN/dalvikvm(270): VFY: rejected Lcom/findthway/main;.nextLayout (Landroid/view/View;)V 
05-17 01:48:02.351: WARN/dalvikvm(270): Verifier rejected class Lcom/findthway/main; 
05-17 01:48:02.351: WARN/dalvikvm(270): Class init failed in newInstance call (Lcom/findthway/main;) 
05-17 01:48:03.031: INFO/ActivityManager(67): Displayed activity com.android.launcher/com.android.launcher2.Launcher: 50893 ms (total 50893 ms) 
05-17 01:48:08.001: WARN/ActivityManager(67): Launch timeout has expired, giving up wake lock! 
05-17 01:48:08.751: WARN/ActivityManager(67): Activity idle timeout for HistoryRecord{43eda500 com.findthway/.main} 
05-17 01:52:41.531: DEBUG/SntpClient(67): request time failed: java.net.SocketException: Address family not supported by protocol 
05-17 01:57:41.551: DEBUG/SntpClient(67): request time failed: java.net.SocketException: Address family not supported by protocol 
05-17 02:02:41.576: DEBUG/SntpClient(67): request time failed: java.net.SocketException: Address family not supported by protocol 
05-17 02:07:41.641: DEBUG/SntpClient(67): request time failed: java.net.SocketException: Address family not supported by protocol 
05-17 02:08:45.831: DEBUG/dalvikvm(67): GC_FOR_MALLOC freed 15592 objects/665856 bytes in 160ms 
05-17 02:12:41.695: DEBUG/SntpClient(67): request time failed: java.net.SocketException: Address family not supported by protocol 
05-17 02:16:30.392: DEBUG/dalvikvm(67): GC_FOR_MALLOC freed 4697 objects/200928 bytes in 108ms 
05-17 02:17:41.716: DEBUG/SntpClient(67): request time failed: java.net.SocketException: Address family not supported by protocol 
05-17 02:22:41.745: DEBUG/SntpClient(67): request time failed: java.net.SocketException: Address family not supported by protocol 
05-17 02:27:41.801: DEBUG/SntpClient(67): request time failed: java.net.SocketException: Address family not supported by protocol 
05-17 02:32:41.812: DEBUG/SntpClient(67): request time failed: java.net.SocketException: Address family not supported by protocol 
05-17 02:37:41.851: DEBUG/SntpClient(67): request time failed: java.net.SocketException: Address family not supported by protocol 
05-17 02:41:00.341: DEBUG/dalvikvm(67): GC_FOR_MALLOC freed 12690 objects/520224 bytes in 235ms 

的例子,将调用断开关情况:

<RelativeLayout android:id="@+id/level07_layout00" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="@drawable/vlayoutup" 
android:visibility="gone"> 
    <ImageButton android:id="@+id/level07_closeButton00" 
    android:layout_height="wrap_content" 
    android:background="@drawable/close" 
    android:layout_width="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_marginLeft="10dp" 
    android:layout_marginBottom="10dp" 
    android:onClick="closetomain"> 
    </ImageButton> 
    <ImageButton android:id="@+id/level07_leftButton00" 
    android:layout_height="wrap_content" 
    android:background="@drawable/node" 
    android:layout_width="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_marginTop="2dp" 
    android:layout_marginLeft="135dp" 
    android:onClick="nextLayout"> 
    </ImageButton> 
    <ImageButton android:id="@+id/level07_rightButton00" 
    android:layout_height="wrap_content" 
    android:background="@drawable/node" 
    android:layout_width="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_marginTop="2dp" 
    android:layout_marginLeft="340dp" 
    android:onClick="nextLayout"> 
    </ImageButton> 
    <ImageView android:id="@+id/level07_beginButton00" 
    android:layout_height="wrap_content" 
    android:background="@drawable/beginbutton" 
    android:layout_width="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_marginBottom="2dp" 
    android:layout_marginLeft="235dp"> 
    </ImageView> 
    <ImageView android:id="@+id/level07_ImageView00" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_marginBottom="5dp" 
    android:layout_marginLeft="325dp" 
    android:background="@drawable/rocket"> 
    </ImageView> 
</RelativeLayout> 

<RelativeLayout android:id="@+id/level07_layout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="@drawable/vlayoutup" 
android:visibility="gone"> 
    <ImageButton android:id="@+id/level07_closeButton01" 
    android:layout_height="wrap_content" 
    android:background="@drawable/close" 
    android:layout_width="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_marginLeft="10dp" 
    android:layout_marginBottom="10dp" 
    android:onClick="closetomain"> 
    </ImageButton> 
    <ImageButton android:id="@+id/level07_leftButton01" 
    android:layout_height="wrap_content" 
    android:background="@drawable/node" 
    android:layout_width="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_marginTop="2dp" 
    android:layout_marginLeft="135dp" 
    android:onClick="nextLayout"> 
    </ImageButton> 
    <ImageButton android:id="@+id/level07_rightButton01" 
    android:layout_height="wrap_content" 
    android:background="@drawable/node" 
    android:layout_width="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_marginTop="2dp" 
    android:layout_marginLeft="340dp" 
    android:onClick="nextLayout"> 
    </ImageButton> 
    <ImageButton android:id="@+id/level07_backButton01" 
    android:layout_height="wrap_content" 
    android:background="@drawable/backlevel" 
    android:layout_width="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:layout_marginBottom="2dp" 
    android:layout_marginLeft="235dp" 
    android:onClick="prevLayout"> 
    </ImageButton> 
</RelativeLayout> 

这里是破的java的一个片段:

case R.id.level07_backButton01: 
     RelativeLayout bB017 = (RelativeLayout)findViewById(R.id.level07_layout00); 
     bB017.setVisibility(View.VISIBLE); 
     RelativeLayout bB017b = (RelativeLayout)findViewById(R.id.level07_layout01); 
     bB017b.setVisibility(View.GONE); 
     break; 
    case R.id.level07_backButton02: 
     RelativeLayout bB027b = (RelativeLayout)findViewById(R.id.level07_layout01); 
     bB027b.setVisibility(View.VISIBLE); 
     RelativeLayout bB027 = (RelativeLayout)findViewById(R.id.level07_layout02); 
     bB027.setVisibility(View.GONE); 
     break; 
    case R.id.level07_backButton03: 
     RelativeLayout bB037 = (RelativeLayout)findViewById(R.id.level07_layout02); 
     bB037.setVisibility(View.VISIBLE); 
     RelativeLayout bB037b = (RelativeLayout)findViewById(R.id.level07_layout03); 
     bB037b.setVisibility(View.GONE); 
     break; 

下面是作品的代码片段来自同一个块:

case R.id.level07_backButton16: 
     RelativeLayout bB167 = (RelativeLayout)findViewById(R.id.level07_layout15); 
     bB167.setVisibility(View.VISIBLE); 
     RelativeLayout bB167b = (RelativeLayout)findViewById(R.id.level07_layout16); 
     bB167b.setVisibility(View.GONE); 
     break; 
    case R.id.level07_backButton17: 
     RelativeLayout bB177 = (RelativeLayout)findViewById(R.id.level07_layout13); 
     bB177.setVisibility(View.VISIBLE); 
     RelativeLayout bB177b = (RelativeLayout)findViewById(R.id.level07_layout17); 
     bB177b.setVisibility(View.GONE); 
     break; 
    case R.id.level07_backButton18: 
     RelativeLayout bB187 = (RelativeLayout)findViewById(R.id.level07_layout17); 
     bB187.setVisibility(View.VISIBLE); 
     RelativeLayout bB187b = (RelativeLayout)findViewById(R.id.level07_layout18); 
     bB187b.setVisibility(View.GONE); 
     break; 

正如你所看到的,我认为,两个开关盒的块是相同的。我认为的一个重要线索就是在logCat中:VFY:无效的切换目标。

如果您需要了解更多信息,请让我知道。先谢谢您的帮助!

+0

我看不到backButton02或03的定义。 (或后来的16/17/18 - 是整个XML? – jkhouw1 2011-05-17 03:26:29

+0

这不是整个XML,只是一个例子,它几乎是一堆类似的块,但它们都具有相同的imageButtons用于后退,关闭和下一个。 – Bret 2011-05-17 04:04:22

+0

你在这个XML中有多少个视图?多少个布局?假设你没有在Button02或Button03上的xml中输入错误,是否有可能超过了#of视图或布局的限制? – jkhouw1 2011-05-17 09:37:52

回答

0

事实证明,在switch语句中有太多的情况。我不知道有一个限制,但我想是有限制的。我把开关语句分解成单独的方法,并且做到了这一点。感谢大家的建议!

0

使用默认情况来捕获未指定的情况,但这不是必需的。

检查the switch statement

+0

感谢您的建议,但这将有助于这些似乎造成的奇怪的致命错误? – Bret 2011-05-17 04:08:43

0

该方法有多大?什么版本的Android?

< = 2.2(“Froyo”)中存在一个错误,其中字节码验证器仅查看开关数据的偏移值的低16位,因此错误地拒绝了一些较大的方法。请参阅http://code.google.com/p/android/issues/detail?id=11552

我不能保证没有看到代码就是同样的问题,但听起来很相似。您可以通过在APK上运行“dexdump”并搜索该方法来检查该方法的大小。