App Absturtz ohne Fehlermeldung der Zeile

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • App Absturtz ohne Fehlermeldung der Zeile

    Hallo,

    ich habe das Problem, dass meine App beim Drücken eines Buttons abstürzt. In der Log wird mir aber nicht angezeigt, in welcher Zeile das Problem liegt, nur das eine NullPointerException das Problem ist.

    Spoiler anzeigen

    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:401)
    at android.widget.ArrayAdapter.getView(ArrayAdapter.java:369)
    at android.widget.AbsListView.obtainView(AbsListView.java:2929)
    at android.widget.ListView.measureHeightOfChildren(ListView.java:1305)
    at android.widget.ListView.onMeasure(ListView.java:1212)
    at android.view.View.measure(View.java:20151)
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:716)
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:462)
    at android.view.View.measure(View.java:20151)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6328)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
    at android.widget.TableLayout.measureChildBeforeLayout(TableLayout.java:461)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
    at android.widget.TableLayout.measureVertical(TableLayout.java:473)
    at android.widget.TableLayout.onMeasure(TableLayout.java:436)
    at android.view.View.measure(View.java:20151)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6328)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
    at android.view.View.measure(View.java:20151)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6328)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
    at android.view.View.measure(View.java:20151)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6328)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
    at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3158)
    at android.view.View.measure(View.java:20151)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2594)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1549)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1841)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7397)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
    at android.view.Choreographer.doCallbacks(Choreographer.java:695)
    at android.view.Choreographer.doFrame(Choreographer.java:631)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7225)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
  • Der Code:

    Java-Quellcode

    1. public class MainActivity extends ListActivity {
    2. final private int REQUEST_CODE_ASK_PERMISSION = 123; //Für die Permission Anfrage ab Android 6.0
    3. BluetoothAdapter bluetoothAdapter;
    4. BroadcastReceiver discoverDevicesReceiver;
    5. BroadcastReceiver discoveryFinishedReceiver;
    6. ArrayList<BluetoothDevice> discoveredDevices;
    7. ArrayList<String> discoveredDevicesNames;
    8. ServerThread serverThread;
    9. ConnectToServerThread connectToServerThread;
    10. @Override
    11. public void onCreate(Bundle savedInstanceState) {
    12. super.onCreate(savedInstanceState);
    13. setContentView(R.layout.activity_main);
    14. discoveredDevices = new ArrayList<BluetoothDevice>(); //Enthält die gefundenen Geräte
    15. discoveredDevicesNames = new ArrayList<String>(); //Enthält die Namen der gefundenen Geräte
    16. bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    17. accessLocationPermission();
    18. }
    19. //Permission Anfrage für Geräte ab Android 6.0
    20. @TargetApi(Build.VERSION_CODES.M)
    21. private void accessLocationPermission() {
    22. int BuildVersion = Integer.valueOf(Build.VERSION.SDK_INT);
    23. if(BuildVersion > 22) {
    24. int accessCoarseLocation = checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION);
    25. int accessFineLocation = checkSelfPermission(android.Manifest.permission.ACCESS_FINE_LOCATION);
    26. List<String> listRequestPermission = new ArrayList<String>();
    27. if (accessCoarseLocation != PackageManager.PERMISSION_GRANTED) {
    28. listRequestPermission.add(android.Manifest.permission.ACCESS_COARSE_LOCATION);
    29. }
    30. if (accessFineLocation != PackageManager.PERMISSION_GRANTED) {
    31. listRequestPermission.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
    32. }
    33. if (!listRequestPermission.isEmpty()) {
    34. String[] strRequestPermission = listRequestPermission.toArray(new String[listRequestPermission.size()]);
    35. requestPermissions(strRequestPermission, REQUEST_CODE_ASK_PERMISSION);
    36. }
    37. }
    38. }
    39. public void MakeDiscoverable(View view){
    40. Intent i = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
    41. i.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
    42. startActivity(i);
    43. }
    44. public void DiscoverDevices(View view){
    45. DiscoveringDevices();
    46. }
    47. private void DiscoveringDevices(){
    48. if(discoverDevicesReceiver == null){
    49. discoverDevicesReceiver = new BroadcastReceiver() {
    50. @Override
    51. public void onReceive(Context context, Intent intent) {
    52. String action = intent.getAction();
    53. if(BluetoothDevice.ACTION_FOUND.equals(action)){
    54. BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
    55. if(!discoveredDevices.contains(device)){
    56. discoveredDevices.add(device);
    57. discoveredDevicesNames.add(device.getName());
    58. setListAdapter(new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, discoveredDevicesNames));
    59. }
    60. }
    61. }
    62. };
    63. }
    64. if(discoveryFinishedReceiver == null){
    65. discoveryFinishedReceiver = new BroadcastReceiver() {
    66. @Override
    67. public void onReceive(Context context, Intent intent) {
    68. getListView().setEnabled(true);
    69. Toast.makeText(getBaseContext(), "Erkennung abgeschlossen. Wählen Sie ein Gerät um Chatten zu beginnen.", Toast.LENGTH_LONG).show();
    70. unregisterReceiver(discoveryFinishedReceiver);
    71. }
    72. };
    73. }
    74. IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_FOUND);
    75. IntentFilter filter2 = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    76. registerReceiver(discoverDevicesReceiver, filter1);
    77. registerReceiver(discoveryFinishedReceiver, filter2);
    78. getListView().setEnabled(false);
    79. Toast.makeText(getBaseContext(), "Der Erkennungsvorgang läuft. Bitte Warten...", Toast.LENGTH_LONG).show();
    80. bluetoothAdapter.startDiscovery();
    81. }
    82. @Override
    83. public void onResume(){
    84. super.onResume();
    85. serverThread = new ServerThread(bluetoothAdapter);
    86. serverThread.start();
    87. }
    88. @Override
    89. public void onPause(){
    90. super.onPause();
    91. bluetoothAdapter.cancelDiscovery();
    92. if(discoverDevicesReceiver != null){
    93. try {
    94. unregisterReceiver(discoverDevicesReceiver);
    95. }catch (Exception e){
    96. }
    97. }
    98. if(connectToServerThread != null){
    99. try {
    100. connectToServerThread.bluetoothSocket.close();
    101. }catch (IOException e){
    102. Log.d("MainActivity", e.getLocalizedMessage());
    103. }
    104. }
    105. if(serverThread != null){
    106. serverThread.cancel();
    107. }
    108. }
    109. public void onListItemClick(ListView parent, View v, int position, long id){
    110. if(connectToServerThread != null){
    111. try {
    112. connectToServerThread.bluetoothSocket.close();
    113. }catch (IOException e ){
    114. Log.d("MainActivity", e.getLocalizedMessage());
    115. }
    116. }
    117. BluetoothDevice deviceSelected = discoveredDevices.get(position);
    118. connectToServerThread = new ConnectToServerThread(deviceSelected, bluetoothAdapter);
    119. connectToServerThread.start();
    120. Toast.makeText(this, "Sie sind verbunden mit "+ discoveredDevices.get(position).getName(), Toast.LENGTH_SHORT).show();
    121. }
    122. public void sendMessage(String bef){
    123. if(connectToServerThread != null){
    124. Log.d(TAG, "Vor dem Senden");
    125. new WriteTask().execute(bef);
    126. Log.d(TAG, "Nach dem Senden");
    127. } else {
    128. Toast.makeText(this, "Zuerst einen Client wählen.", Toast.LENGTH_SHORT).show();
    129. }
    130. }
    131. private class WriteTask extends AsyncTask<String, Void, Void>{
    132. protected Void doInBackground(String... args){
    133. try {
    134. connectToServerThread.commsThread.write(args[0]);
    135. }catch (Exception e){
    136. Log.d("MainActivity", e.getLocalizedMessage());
    137. }
    138. return null;
    139. }
    140. }
    141. }
    Alles anzeigen
  • Ja debug modus versucht nichts auffälliges gefunden.

    Allerdings habe ich gerade 2 Sachen bemerkt. Die Probleme treten auf einem Gerät mit Android 6.0 auf.
    1. Auf einem 2. Gerät mit Android 5.0 läuft die App ohne Absturzt, weswegen ich denke, dass das Problem in der Methode in Zeile 30 liegt. Da hier ja nur eine Methode extra ist, die auf Android 6.0 einfluss hat.
    2. Desweiteren stürzt die App auf dem Gerät mit Andorid 6.0 nicht ab, wenn ich für die Zeile 77 "setListAdapter(new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, discoveredDevicesNames));" statt der ArrayList "discoveredDevicesNames", eine neue Arraylist wie folgt anlege:

    - ArrayList<String> test = new ArrayList<>();
    - test.add("Test");
    - setListAdapter(new ArrayAdapter<String>(getBaseContext(), android.R.layout.simple_list_item_1, test));
    Wenn ich es so wie in Punkt 2 mache stürzt die App auch nicht ab.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von omax1 ()

  • Da stehen die Namen von Geräten, die über Bluetooth gefunden werden. In Zeile 75 wird in diese ArrayList geaddet wenn ein Gerät gefunden wurde.

    Edit1: Weiß nicht ob diese Info wichtig ist, aber die App hat vor 2 Wochen funktioniert gehabt. Habe die App dann heute nochmal gestartet und dann ging nichts mehr und habe am Code nichts verändert, dass wunder mich auch ein wenig. Kann das Problem am Gerät liegen aber wenn dann woran genau?
  • evtl kannst du auch Logger einbauen (also zu bestimmten Punkten einen Text ausgeben lassen, der dann nur im LogCat auftaucht).
    so mache ich es, damit ich weiß und auch sehe und auch nachvollziehe, welchen Punkt das System passiert hat.
    Ich weiß, ist manchmal umständlich, aber mir hilft es.

    In der Zwischenzeit dürfte es aber ein Update bei AS gegeben haben. Das kann durchaus daran liegen.

    Wie sieht den deine Gradle Datei aus ?

    VG Carsten
    Humor ist....wenn man trotzdem lacht :saint:
  • An einem Update von AS dürfte es nicht liegen, da ich gerade ein backup einer apk von vor 2 wochen getestet habe und es läuft damit unter Android 6.0 auch nicht, jedoch unter Android 5.0 schon. Habe den verdacht, dass es mit den zusätzlichen Berechtigungen unter Android 6.0 zusammen hängt. Die Methode in Zeile 30, die die zusätzlichen Bluetooth-Berechtigungen abfragt, hab ich so aber schon mal getestet gehabt und es hat funktioniert.
  • Gradle von der Module:app nehme ich an :

    Spoiler anzeigen

    apply plugin: 'com.android.application'

    android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    defaultConfig {
    applicationId "com.ba.bluetoothchat"
    minSdkVersion 21
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
    release {
    minifyEnabled false
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    }
    }

    dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    }