java - 无法确定空指针异常背后的原因

标签 java android bluetooth nullpointerexception

我正在使用我的 arduino uno 和 HC-05 蓝牙模块创建一个家庭自动化 Android 应用程序。一切都已经很好了。它可以扫描、连接、开/关蓝牙、使用按钮和开关控制控制灯泡的开和关,但应用程序的设计很糟糕且朴素。所以我决定使用选项卡小部件。问题是,当我更改某些内容时,它不会运行并显示 NullPointerException 问题,而且我不知道为什么会发生 ots,因为它在过去几天里已经是一个可以运行的应用程序。

以下是 LogCat 中的列表:

02-21 08:48:18.063: E/AndroidRuntime(25982): FATAL EXCEPTION: main
02-21 08:48:18.063: E/AndroidRuntime(25982): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.javac101/com.example.javac101.MainActivity}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.javac101/com.example.javac101.ControllerTab}: java.lang.NullPointerException
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2343)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.ActivityThread.access$600(ActivityThread.java:162)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.os.Handler.dispatchMessage(Handler.java:107)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.os.Looper.loop(Looper.java:194)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.ActivityThread.main(ActivityThread.java:5371)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at java.lang.reflect.Method.invokeNative(Native Method)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at java.lang.reflect.Method.invoke(Method.java:525)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at dalvik.system.NativeStart.main(Native Method)
02-21 08:48:18.063: E/AndroidRuntime(25982): Caused by: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.javac101/com.example.javac101.ControllerTab}: java.lang.NullPointerException
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2343)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.ActivityThread.startActivityNow(ActivityThread.java:2186)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:749)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.widget.TabHost.setCurrentTab(TabHost.java:413)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.widget.TabHost.addTab(TabHost.java:240)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at com.example.javac101.MainActivity.onCreate(MainActivity.java:164)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.Activity.performCreate(Activity.java:5122)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
02-21 08:48:18.063: E/AndroidRuntime(25982):    ... 11 more
02-21 08:48:18.063: E/AndroidRuntime(25982): Caused by: java.lang.NullPointerException
02-21 08:48:18.063: E/AndroidRuntime(25982):    at com.example.javac101.ControllerTab.onCreate(ControllerTab.java:110)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.Activity.performCreate(Activity.java:5122)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
02-21 08:48:18.063: E/AndroidRuntime(25982):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
02-21 08:48:18.063: E/AndroidRuntime(25982):    ... 21 more

我的 MainActivity 中的 Logcat 中提到的行:

tabHost.addTab(tabSpecController);

我的 ControllerTab 中的 Logcat 中提到的行:

list.setOnItemClickListener(new OnItemClickListener()

可能不太明白,所以这是我在MainActivity中的代码: 包 com.example.javac101;

public class MainActivity extends TabActivity {

    //BLUETOOTH
        BluetoothAdapter            BTAdapter;
        //BluetoothDevice               BTDevice;

    //Layout view daw
        public static TextView title;
        public static ImageView status;

    //Intent
        private static final int    REQUEST_DEVICE_CONNECT = 1;
        private static final int    REQUEST_ENABLE_BLUETOOTH = 2;
        private static final int    REQUEST_ABOUTS = 3;


        //object for bluetooth command service
        public static BluetoothCommandService commandService = null;


        //
        private String connectedDeviceName = null;

        //Message types sent from the Handler
        public static final int MESSAGE_STATE_CHANGE = 1;
        public static final int MESSAGE_READ = 2;
        public static final int MESSAGE_WRITE = 3;
        public static final int MESSAGE_DEVICE_NAME = 4;
        public static final int MESSAGE_TOAST = 5;
        public static final int RECIEVE_MESSAGE = 6;



        //Will be used in BluetoothCommandSrvice jave file
        public static final String TOAST = "toast";
        public static final String DEVICENAME = "device name";


        public static final String HC05 = "20:13:06:19:34:54";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        String address = new String(DeviceList.EXTRA_DEVICE_MAC_ADDRESS);
        if (address.equals(MainActivity.HC05))
        {
            Intent login = new Intent (this, LoginActivity.class);
        }
        else
        {
            requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
            setContentView(R.layout.tabs);

            /**
             * DATABASE CRUD Operations
             * */

            DatabaseHandler db = new DatabaseHandler(this);

            // Inserting Devices
            Log.d("Insert: ", "Inserting .."); 
            db.addDevice(new Device(1, "DB Device 1"));        
            db.addDevice(new Device(2, "DB Device 2"));
            db.addDevice(new Device(3, "DB Device 3"));

        // Reading all devices
            Log.d("Reading: ", "Reading all devices.."); 
            List<Device> devices = db.getAllDevices();

            for (Device dv : devices) {
                String log = "Id: "+dv.getID()+" ,Name: " + dv.getName();
                Log.d("Name: ", log);
            }


            getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title);
                title = (TextView) findViewById(R.id.title_left_text);  // Set up the custom title
                title.setText(R.string.app_name);                       // Set up the custom title
                title = (TextView) findViewById(R.id.title_right_text); // Set up the custom title
Resources ressources = getResources(); 
            TabHost tabHost2 = getTabHost();
            TabHost tabHost = tabHost2; 

            // Controller Tab
            Intent intentController = new Intent().setClass(this, ControllerTab.class);
            TabSpec tabSpecController = tabHost
                    .newTabSpec("Controller")
                    .setIndicator("", ressources.getDrawable(R.drawable.icon_home_config))
                    .setContent(intentController);

            // Setting Tab
                    Intent intentSetting = new Intent().setClass(this, Settings.class);
                    TabSpec tabSpecSetting = tabHost
                      .newTabSpec("Setting")
                      .setIndicator("", ressources.getDrawable(R.drawable.icon_settings_config))
                      .setContent(intentSetting);


            // add all tabs 
            tabHost.addTab(tabSpecController);
            tabHost.addTab(tabSpecSetting);

            //set Windows tab as default (zero based)
            tabHost.setCurrentTab(0);
// AUTO REQUEST OF ENABLING THE BLUETOOTH
            BTAdapter = BluetoothAdapter.getDefaultAdapter();

            //A code that will detect if BT is enabled otherwise will require it.
            if (BTAdapter == null)
            {
                //Toast.makeText(context, text, duration)
                Toast.makeText(this, "No Bluetooth adapter is available.", Toast.LENGTH_LONG).show();
                finish();
                return;
            }


        }
    }



    private void setVisible(int tabs, boolean b) {
        // TODO Auto-generated method stub

    }



    @Override
    protected void onStart()
    {
        super.onStart();
        //Requesting Bluetooth automatically when its not yet enabled.
        if (!BTAdapter.isEnabled())
        {
            Intent enableIntent = new Intent (BluetoothAdapter.ACTION_REQUEST_ENABLE);
            //startActivityForResult(enableIntent, 0);
            startActivityForResult(enableIntent, REQUEST_ENABLE_BLUETOOTH);
        }
        else
        {
            if (commandService == null)
                setupCommand();
        }
    }
@Override
    protected void onResume() {
        super.onResume();

        if (commandService != null)
        {
            if (commandService.getState() == BluetoothCommandService.stateNothing)
            {
                commandService.start();
            }
        }       
    }

    private void setupCommand()
    {
        commandService = new BluetoothCommandService(this, bluetoothHandler);
    }

    @Override
    protected void onDestroy()
    {
        super.onDestroy();
        if (commandService != null)
            commandService.stop();
    }
public final Handler bluetoothHandler = new Handler()
        {   
            @Override
            public void handleMessage(android.os.Message msg)
            {
                switch (msg.what)
                {
                    case MESSAGE_STATE_CHANGE:
                        switch (msg.arg1)
                        {
                            case BluetoothCommandService.stateConnected:
                                title.setText(R.string.title_connectedTo);
                                title.append(connectedDeviceName);
                                break;

                            case BluetoothCommandService.stateConnecting:
                                title.setText(R.string.title_connecting);
                                break;

                            case BluetoothCommandService.stateListen:
                            case BluetoothCommandService.stateNothing:
                                title.setText(getString(R.string.title_notConnected));
                                break;
                        }
                        break;

                    case MESSAGE_DEVICE_NAME:
                        connectedDeviceName = msg.getData().getString(DEVICENAME);
                        Toast.makeText(getApplicationContext(), "Connected to " + connectedDeviceName, Toast.LENGTH_SHORT).show();
                        break;

                    case MESSAGE_TOAST:
                        Toast.makeText(getApplicationContext(), msg.getData().getString(TOAST), Toast.LENGTH_SHORT).show();
                        break;

                    //case RECIEVE_MESSAGE:                                                 // if receive message
                    //  byte[] readBuf = (byte[]) msg.obj;
                    //  String strIncom = new String(readBuf, 0, msg.arg1);                 // create string from bytes array
                    //  sb.append(strIncom);                                                // append string
                    //  int endOfLineIndex = sb.indexOf("\r\n");                            // determine the end-of-line
                    //  if (endOfLineIndex > 0) {                                           // if end-of-line,
                    //      //String sbprint = sb.substring(0, endOfLineIndex);             // extract string
                    //        sb.delete(0, sb.length());                                        // and clear
                            //txtArduino.setText("Data from Arduino: " + sbprint);          // update TextView
                            //1/4/14
                    //      btn_d1_on.setEnabled(true);
                    //  btn_d1_off.setEnabled(true); 
                        //   }
                        //Log.d(TAG, "...String:"+ sb.toString() +  "Byte:" + msg.arg1 + "...");
                        //break;

                }
                //return false;
            }
        };
        //});

        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            switch (requestCode) {
            case REQUEST_DEVICE_CONNECT:
                // When DeviceList Activity returns with a device to connect
                if (resultCode == Activity.RESULT_OK) {
                    // Get the device MAC address
                    //String address = data.getExtras().getString(DeviceList.EXTRA_DEVICE_MAC_ADDRESS);
                    String address = new String(data.getExtras().getString(DeviceList.EXTRA_DEVICE_MAC_ADDRESS));
                        if (address.equals(HC05))
                        {
                            // Get the BLuetoothDevice object
                            BluetoothDevice device = BTAdapter.getRemoteDevice(address);
                            // Attempt to connect to the device
                            commandService.connect(device);
                        }
                        else
                        {
                            Toast.makeText(this, "This device is not for JavaC101 Application. Please connect to HC-05 device.", Toast.LENGTH_LONG).show();
                        }
                }
                break;

            case REQUEST_ENABLE_BLUETOOTH:
                // When the request to enable Bluetooth returns
                if (resultCode == Activity.RESULT_OK) {
                    // Bluetooth is now enabled, so set up a chat session
                    setupCommand();
                } else {
                   // User did not enable Bluetooth or an error occured
                    Toast.makeText(this, R.string.notEnabledBluetooth, Toast.LENGTH_SHORT).show();
                    finish();
               }


            }
        }
@Override
    //Creating an Option Menu for connectivity and discoverability of a BT device
    public boolean onCreateOptionsMenu(Menu menu)
    {
        //MenuInflater is a class
        MenuInflater OptionMenu = getMenuInflater();
        //OptionMenu.inflate(menuRes, menu)
        OptionMenu.inflate(R.menu.main, menu);
        return true;
    }




    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
            case R.id.connect:
                connect();
                return true;
            case R.id.bton:
                bluetoothOn();
                return true;
            case R.id.btoff:
                bluetoothOff();
                return true;
            case R.id.abouts:
                abouts();
                return true;
            //default:
                //return super.onOptionsItemSelected(item);
        }
        return false;
    }

    //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

      private void connect()
      {
          Intent serverIntent = new Intent(this, DeviceList.class);
          this.startActivityForResult(serverIntent, REQUEST_DEVICE_CONNECT);
          //startActivityForResult(serverIntent, REQUEST_DEVICE_CONNECT);
      }

      private void bluetoothOn()
      {
          BTAdapter.enable();
          Toast.makeText(this, "Bluetooth is now turned on", Toast.LENGTH_SHORT).show();
      }

      private void bluetoothOff()
      {
          BTAdapter.disable();
          Toast.makeText(this, "Bluetooth is now turned off.", Toast.LENGTH_SHORT).show();
      }

      private void abouts()
      {
          Intent intentAbouts = new Intent(this, abouts.class);
          //startActivityForResult(intentAbouts, REQUEST_ABOUTS);
          startActivity(intentAbouts);
      }

由于我的另一个类 ControllerTab 中也存在错误,因此这里是我的代码: 公共(public)类 ControllerTab 扩展 Activity 实现 OnItemClickListener {

    //BluetoothAdapter          BTAdapter;
    public static BluetoothAdapter          BTAdapter;
    //Intent
    private static final int    REQUEST_DEVICE_CONNECT = 1;
    private static final int    REQUEST_ENABLE_BLUETOOTH = 2;
    private static final int    REQUEST_ABOUTS = 3;
    //
    private String connectedDeviceName = null;
    //Message types sent from the Handler
    public static final int MESSAGE_STATE_CHANGE = 1;
    public static final int MESSAGE_READ = 2;
    public static final int MESSAGE_WRITE = 3;
    public static final int MESSAGE_DEVICE_NAME = 4;
    public static final int MESSAGE_TOAST = 5;
    public static final int RECIEVE_MESSAGE = 6;
  //Will be used in BluetoothCommandSrvice jave file
        public static final String TOAST = "toast";
        public static final String DEVICENAME = "device name";

    //@@@@@@@for the controller
    public static final String tagStateCTRL = "Controller";
    private OutputStream outStream = null;
    private static final UUID myUUID = UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66");
    private static String address = "00:00:00:00:00:00"; // Insert your bluetooth devices MAC address
    private StringBuilder sb = new StringBuilder();
    Button btn_d1_on, btn_d1_off, btn_d2_on, btn_d2_off;
    Switch switch_d1, switch_d2;
    TextView textDevice1;

        //for the switch
        private final static Integer[] ids = { R.id.switch1, R.id.switch2 };


        //object for bluetooth command service
        private BluetoothCommandService commandService = null;

        //listview, swtchcontrol
        private ArrayAdapter<String> switchControls;

        private TextView deviceID;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        DatabaseHandler db = new DatabaseHandler(this);
        List<Device> deviceList = db.getAllDevices();
        if (deviceList.size()!=0) {
            ListView list = getListView();
            list.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> arg0, View view, int arg2, long arg3) {
                    deviceID = (TextView) view.findViewById(R.id.deviceId);
                    String valDeviceId = deviceID.getText().toString();
                    Intent objIndent = new Intent(getApplicationContext(), EditDeviceName.class);
                    objIndent.putExtra("deviceID", valDeviceId);
                    startActivity(objIndent);
                }
            });
// Initialize the BluetoothChatService to perform bluetooth connections
         commandService = new BluetoothCommandService(this, bluetoothHandler);
         BTAdapter = BluetoothAdapter.getDefaultAdapter();

        switch_d1 = (Switch) findViewById(R.id.switch1);
        switch_d2 = (Switch) findViewById(R.id.switch2);

            registerOnCheckedListener(ids);
 }}
    private ListView getListView() {
        // TODO Auto-generated method stub
        return null;
    }
@SuppressLint("NewApi")
    private void registerOnCheckedListener(Integer... ids)
    {
        for (int i=0; i<ids.length; i++)
        {
            Integer id = ids[i];
            Switch switchControl = (Switch) findViewById(id);
            switchControl.setOnCheckedChangeListener((OnCheckedChangeListener) this);
        }
    }

    //@Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        switch (buttonView.getId())
        {
            case R.id.switch1:
                    if (isChecked)
                        //ga error man sooooo "surround with try/catch" pra mwala.. ok? ^_^
                        try {
                            String address = new String(DeviceList.EXTRA_DEVICE_MAC_ADDRESS);
                            if (address.equals(MainActivity.HC05))
                            {
                                sendData("1");
                            }
                            else
                            {
                                Toast.makeText(this, "Your phone is not connected to HC-05.", Toast.LENGTH_SHORT).show();
                            }
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    else
                        try {
                            String address = new String(DeviceList.EXTRA_DEVICE_MAC_ADDRESS);
                            if (address.equals(MainActivity.HC05))
                            {
                                sendData("3");
                            }
                            else
                            {
                                Toast.makeText(this, "Your phone is not connected to HC-05.", Toast.LENGTH_SHORT).show();
                            }
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    return;
            case R.id.switch2:
                if (isChecked)
                    try {
                        String address = new String(DeviceList.EXTRA_DEVICE_MAC_ADDRESS);
                        if (address.equals(MainActivity.HC05))
                        {
                            sendData("2");
                        }
                        else
                        {
                            Toast.makeText(this, "Your phone is not connected to HC-05.", Toast.LENGTH_SHORT).show();
                        }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                else
                    try {
                        String address = new String(DeviceList.EXTRA_DEVICE_MAC_ADDRESS);
                        if (address.equals(MainActivity.HC05))
                        {
                            sendData("4");
                        }
                        else
                        {
                            Toast.makeText(this, "Your phone is not connected to HC-05.", Toast.LENGTH_SHORT).show();
                        }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
        }
    }
...

最佳答案

这是您当前拥有的:

list = getListView()

...

private ListView getListView() {
    // TODO Auto-generated method stub
    return null;
}

您需要实现getListView

关于java - 无法确定空指针异常背后的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21922950/

相关文章:

java - 设置和更新连接池 (OracleConnectionPoolDataSource) 属性以获得最佳性能

java - 无法加载: InvalidPluginException

android - 新创建的布局文件未添加到 R.java

java - 如何修复代码以删除 -Xlint :unchecked warning while compiling

android - 从画廊android中的图像扫描条形码

android - RecyclerView itemView OnGlobalLayoutListener 不会为所有 itemView 触发

android - Android 4.0 中的蓝牙智能 (4.0)/GATT 支持?

android - Virtualbox 上 Android x86 中的蓝牙

android - iOS 7 Multipeer Connectivity 是否与 Android Wi-Fi Direct 兼容?

java - Selenium (Java) - 显示按运行而不是按测试用例列出的套件结果