Java &引用;空对象引用错误“;尝试使用TTS时

Java &引用;空对象引用错误“;尝试使用TTS时,java,android,Java,Android,我正在尝试使用文本到语音转换,但出现以下错误: 2020-07-26 22:58:51.87615964-15964/ch.yourclick.kitt E/AndroidRuntime:致命异常:主 进程:ch.yourclick.kitt,PID:15964 java.lang.NullPointerException:尝试调用虚拟方法'int android.speech.tts.TextToSpeech.speak(java.lang.String,int, java.util.Hash

我正在尝试使用文本到语音转换,但出现以下错误:

2020-07-26 22:58:51.87615964-15964/ch.yourclick.kitt E/AndroidRuntime:致命异常:主 进程:ch.yourclick.kitt,PID:15964 java.lang.NullPointerException:尝试调用虚拟方法'int android.speech.tts.TextToSpeech.speak(java.lang.String,int, java.util.HashMap)“”在空对象引用上 在ch.yourclick.kitt.MainActivity.speak(MainActivity.java:61) 在ch.yourclick.kitt.fragments.GeneralFragment$1.onClick(GeneralFragment.java:59)

MainActivity.java

包ch.yourclick.kitt;
导入android.os.Bundle;
导入com.google.android.material.floatingactionbutton.floatingactionbutton;
导入com.google.android.material.snackbar.snackbar;
导入com.google.android.material.tabs.TabLayout;
导入androidx.viewpager.widget.viewpager;
导入androidx.appcompat.app.appcompat活动;
导入android.speech.tts.TextToSpeech;
导入android.util.Log;
导入android.view.view;
导入java.util.Locale;
导入ch.yourclick.kitt.ui.main.SectionsPagerAdapter;
公共类MainActivity扩展了AppCompatActivity{
公共文本语音tts;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SectionsPagerAdapter SectionsPagerAdapter=新的SectionsPagerAdapter(这个,getSupportFragmentManager());
ViewPager ViewPager=findViewById(R.id.view\u pager);
viewPager.setAdapter(sectionsPagerAdapter);
TabLayout tabs=findviewbyd(R.id.tabs);
选项卡。使用viewPager进行设置(viewPager);
FloatingActionButton fab=findViewById(R.id.fab);
//文本到语音
tts=new TextToSpeech(这是new TextToSpeech.OnInitListener(){
@凌驾
公共无效onInit(int状态){

如果(status==TextToSpeech.SUCCESS){/请考虑您文章中的以下两个片段:

// Code found in onCreate(...) in MainActivity.java
tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
    // A bunch of code here
}

您可能会得到一个
NullPointerException
,因为当您通过调用
mainActivity.speak()
时,
tts
为null

虽然您的意图是好的,但这没有按计划工作的原因是您实际上正在创建一个未经过适当生命周期步骤的
MainActivity
的新实例,这意味着
onCreate(…)
从未被调用,因此在该特定活动实例中,
tts
从未被分配。值得一提的是,您的片段正在运行的“真实”活动实例应该正确设置

那么,让它工作的最快方法是什么呢?好吧,我想说,获取当前活动,如果可能,将其转换为
MainActivity
,并尝试在该实例上调用
speak()

hello.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        final Activity activity = getActivity();
        if (activity instanceof MainActivity) {
            ((MainActivity) activity).speak();
        }
    }
});

考虑一下您文章中的以下两个片段:

// Code found in onCreate(...) in MainActivity.java
tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
    // A bunch of code here
}

您可能会得到一个
NullPointerException
,因为当您通过调用
mainActivity.speak()
时,
tts
为null

虽然您的意图是好的,但这没有按计划工作的原因是您实际上正在创建一个未经过适当生命周期步骤的
MainActivity
的新实例,这意味着
onCreate(…)
从未被调用,因此在该特定活动实例中,
tts
从未被分配。值得一提的是,您的片段正在运行的“真实”活动实例应该正确设置

那么,让它工作的最快方法是什么呢?好吧,我想说,获取当前活动,如果可能,将其转换为
MainActivity
,并尝试在该实例上调用
speak()

hello.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        final Activity activity = getActivity();
        if (activity instanceof MainActivity) {
            ((MainActivity) activity).speak();
        }
    }
});