虚方法' void android.widget.TextView.setText(java.lang.CharSequence)'在null对象引用上

时间:2017-11-03 02:42:25

标签: java android

我正在开发一个QRCode应用程序,它能够注意到QRCode是一个URL,因此它会自动在手机上的Web浏览器上搜索它(或者甚至只是拥有它所以它可以超链接,你必须点击它)。我收到了这个错误:

  

尝试调用虚方法' void android.widget.TextView.setText(java.lang.CharSequence)'在空对象引用上

有什么想法吗?

package com.varvet.barcodereadersample;

import android.content.Intent;
import android.graphics.Point;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.google.android.gms.common.api.CommonStatusCodes;
import com.google.android.gms.vision.barcode.Barcode;
import com.varvet.barcodereadersample.barcode.BarcodeCaptureActivity;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class MainActivity extends AppCompatActivity {
    private static final String LOG_TAG = MainActivity.class.getSimpleName();
    private static final int BARCODE_READER_REQUEST_CODE = 1;

    private TextView mResultTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mResultTextView = (TextView) findViewById(R.id.text);

        Button scanBarcodeButton = (Button) findViewById(R.id.scan_barcode_button);
        scanBarcodeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), BarcodeCaptureActivity.class);
                startActivityForResult(intent, BARCODE_READER_REQUEST_CODE);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == BARCODE_READER_REQUEST_CODE) {
            if (resultCode == CommonStatusCodes.SUCCESS) {
                if (data != null) {
                    Barcode barcode = data.getParcelableExtra(BarcodeCaptureActivity.BarcodeObject);
                    Point[] p = barcode.cornerPoints;

                    mResultTextView.setText(barcode.displayValue);
                    try{
                        URL url = new URL ("" + mResultTextView.getText());
                        URLConnection conn = url.openConnection();
                        conn.connect();
                    } catch (MalformedURLException e) {
                        mResultTextView.setText("invalid url");
                    } catch (IOException e) {
                        mResultTextView.setText("no connection to url placed");
                    }
                } else mResultTextView.setText(R.string.no_barcode_captured);
            } else Log.e(LOG_TAG, String.format(getString(R.string.barcode_error_format),
                    CommonStatusCodes.getStatusCodeString(resultCode)));
        } else super.onActivityResult(requestCode, resultCode, data);
    }
}

2 个答案:

答案 0 :(得分:0)

您正在将int传递给方法,该方法将假设它是一个字符串资源您正在某处传递null

setText(CharSequence);

setText(int_resource_like_R.string.something);


在这里做什么:

首先检查String是否为空或如下所示为空:

if(!TextUtils.isEmpty(String.valueOf(barcode.displayValue))){

}

如果没有,那么在if块中你有两个替代方法!

该方法认为您传递的是R.string.something之类的字符串资源,因此请通过两种方式进行更改:

第一

mResultTextView.setText(""+barcode.displayValue);

这将连接String,它将使int在Java中自动成为一个字符串。另一种方式是:

第二

mResultTextView.setText(String.valueOf(barcode.displayValue));

这会将你的int转换为String,然后显示你的文字。

答案 1 :(得分:0)

你的问题

  

空对象引用上的方法'void android.widget.TextView.setText(java.lang.CharSequence)'

如果barcode.displayValue的类型不是String,则应将其解析为String

if(!TextUtils.isEmpty(String.valueOf(barcode.displayValue))){
    mResultTextView.setText(String.valueOf(barcode.displayValue));
}

修改

根据@Mike M.的评论。

你的xml代码中可以有R.id.text吗?

检查一下。

mResultTextView = (TextView) findViewById(R.id.text);

示例

<TextView
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

你有android:id="@+id/text"吗?